Re: Deleting an Object and setting the Pointer to NULL
On Mar 17, 9:50 pm, Seungbeom Kim <musip...@bawi.org> wrote:
James Kanze wrote:
There are several very important reasons:
-- Finally, most of the time when there is just a single
pointer, it is in an object, and the delete is in the
destructor, so there's no point---the pointer itself will
cease to exist.
Except when the pointer is in a container, in which case you have to
explicitly set the pointer to null to avoid undefined behaviour,
In theory. (But of course, then it's not a case of "just a
single pointer", either.) In practice, it's not something I
worry about in production code.
And of course, the other solution would be to remove it first
from the container. Something like:
while ( ! myVector.empty() ) {
T* p = myVector.back() ;
myVector.pop_back() ;
delete p ;
}
More "in", of course, would be to use swap:
for ( std::vector< T >::iterator iter = myVector.begin() ;
iter != myVector.end() ;
++ iter ) {
T* p = NULL ;
std::swap( p, *iter ) ;
delete p ;
}
(I'm just joking, of course. See below for a more reasonable
solution.)
IIRC:
for (i = begin(); i != end(); ++i) delete *i, *i = 0;
or
for (i = begin(); i != end(); ++i) delete i->second, i->second = 0;
Formally, I think that even those have undefined behavior. You
have to remove the pointer from the container in some way
(removing the element or changing its value) *before* the
delete. The simple presence of the pointer in the container
after delete is undefined behavior, and presumable, the
operator*() called in the expression to null the pointer could
in fact trigger such undefined behavior.
In the past I've written the following to avoid repeating the same code:
template <typename T>
inline void delete_ptr(const T*& p)
{ boost::checked_delete(p); p = 0; }
If you really care:
{
T* tmp = p ;
p = NULL ;
delete tmp ;
}
Otherwise, you've not eliminated the undefined behavior.
Note, however, that you're still not setting to null the operand
of the delete:-).
--
James Kanze (Gabi Software) email: james.kanze@gmail.com
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]