Yes, of course. The variable str
, of type string *
, is still in scope. It will cease to exist as soon as its current scope is exited. For example at the end of the function or { }
-delimited block which contains these instructions.
This is why it is good practice to stop pointing to the adress where new string
was once allocated, and which now it is no longer valid. It's always good for an existing to point to either valid memory or NULL.
string *str = new string;
delete str;
str = NULL;
Note that after the third line you can now ask "is str pointing to a valid memory location?", i.e. "can I dereference it safely?".
if (str != NULL) ...
Without setting the pointer to NULL, on the other hand, you couldn't possibly do this kind of check. You should just remember that after the delete instruction it is now invalid to dereference str, and hence not do it. Clearly this is calling for trouble.
Although correct, this kind of code (a new locally matched with a delete, and any living pointer set to NULL after deleting its target memory location) is quite vulnerable and error prone in case of future changes. For example, what if the function isn't so simple, and in the path between new and delete you have conditionals and loops? What if you passed str to another function as a parameter? What did this function do with the pointer: copy it, clone the object it points to...?
A technique called RAII - Resource Allocation Is Initialization (see this question) helps to create designs that prevent such kinds of errors as memory leaks and memory access violations.
Note: Slightly more intuitive, although less orthodox names for RAII have been suggested on this site: UDSTMR - Using Destructor Semantics To Manage Resources, or UTSTTC - Using The Stack To Trigger Cleanup. See this answer.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…