Replacing delete in C++, missinformation
-
23-06-2021 - |
Question
I'm trying to (and have solved) a problem with 16 byte alignment issues with a class that contains SSE optimised members. But what is bugging me is a large portion of the examples I have found online contain a line of code that to me seems totally redundant yet is repeated in many places.
public:
void* operator new (size_t size)throw (std::bad_alloc)
{
void * p = _aligned_malloc(size, 16);
if (p == 0) throw std::bad_alloc();
return p;
}
void operator delete (void *p)
{
Camera* pC = static_cast<Camera*>(p);
_aligned_free(p);
}
The line in question is
Camera* pC = static_cast<Camera*>(p);
As pC is never referenced and goes out of scope at the end of the function, what is the point of doing it? I have tried taking the line out and it appears to make no difference at all yet that line appears in lots of examples! Am I missing something really obvious or has an anomalous line of code been copied from example to example blindly and become prevalent across a lot of "tutorials"?
Solution
The object ends its lifetime as soon as the destructor is entered, so you cannot do much with this pointer. The line Camera* pC = static_cast<Camera*>(p);
can be removed safely and the only reason it exists in tutorials is that many people just copy-n-paste the code here and there without actually thinking how it works.
The clean and correct code for your delete()
will look as follows:
void operator delete (void *p)
{
_aligned_free(p);
}
OTHER TIPS
As discussed in many comments to your question, the following line is indeed redundant:
Camera* pC = static_cast<Camera*>(p); // Just an unused variable
Even if the p
was of type Camera*
before (other possibilities are the subclasses like Canon*
, Sony*
, Nikon*
), you still cannot do much with pC
, because the Camera::~Camera()
should have already been called. operator delete
is called after that.
P.S.: I haven't come across such practice to cast a pointer to specific class, but if you encounter such advise in a tutorial then you may want to change it.