I have seen many instances using below code (assuming older standard before nullptr).
if (myAllocatedObject != NULL)
{
delete myAllocatedObject;
}
This is absolutely ridiculous. C++ standard guarantees that delete on NULL pointer is harmless and has no effect. Of-course, this is true only if object was allocated using new. It would be bad coding too if you try to deallocate memory using delete which was not constructed by new. This in fact applies to every allocator/deallocator combination.
Suppose if you use your own allocator, then the deallocator also needs to be supplied. It will be absurd if you restrict only to allocator.
Conclusively, the redundant NULL check is worthless. Also the code looks downright ugly.
How does libstdc++ behave?
While peeking source tree, you get from del_op.cc
_GLIBCXX_WEAK_DEFINITION void
}
And std::free leads to cstdlib.h which in turn includes glibc stdlib.h and then to
Phew! We landed and also freed safely :-)
PS: I heard few static analyzers also complain if you don't wrap the delete with NULL check. I cannot vouch for this statement as of now since there was never an instance stumbled upon.
if (myAllocatedObject != NULL)
{
delete myAllocatedObject;
}
This is absolutely ridiculous. C++ standard guarantees that delete on NULL pointer is harmless and has no effect. Of-course, this is true only if object was allocated using new. It would be bad coding too if you try to deallocate memory using delete which was not constructed by new. This in fact applies to every allocator/deallocator combination.
Suppose if you use your own allocator, then the deallocator also needs to be supplied. It will be absurd if you restrict only to allocator.
Conclusively, the redundant NULL check is worthless. Also the code looks downright ugly.
How does libstdc++ behave?
While peeking source tree, you get from del_op.cc
_GLIBCXX_WEAK_DEFINITION void
operator delete(void* ptr) _GLIBCXX_USE_NOEXCEPT |
{ |
std::free(ptr); |
And std::free leads to cstdlib.h which in turn includes glibc stdlib.h and then to
void
__libc_free (void *mem)
if (mem == 0) /* free(0) has no effect */
return;
Phew! We landed and also freed safely :-)
No comments:
Post a Comment