Does delete[] call destructors?

Mixthos picture Mixthos · Jun 27, 2013 · Viewed 13.3k times · Source

I am writing a template class which internally manages an array of the given type. Like this:

template<typename T>
class Example {
    // ...
private:
    T* objects; // allocated in c'tor (array), deleted in d'tor
    // ...
};

I was wondering if C++ calls the destructor of each object in objects when I delete it via delete[] objects;.

I need to know this, because the objects in my class do not contain sensible values all the time, so the destructors should not be called when they don't.

Additionally, I'd like to know if the destructors would be called if I declared a fixed-sized array like T objects[100] as part of Example<T>.

Answer

hmjd picture hmjd · Jun 27, 2013

If T has a destructor then it will be invoked by delete[]. From section 5.3.5 Delete of the c++11 standard (draft n3337), clause 6:

If the value of the operand of the delete-expression is not a null pointer value, the delete-expression will invoke the destructor (if any) for the object or the elements of the array being deleted. In the case of an array, the elements will be destroyed in order of decreasing address (that is, in reverse order of the completion of their constructor; see 12.6.2).

The destructor for a type T will also be invoked for each element in an array of T[] when the array is not dynamically allocated and array goes out of scope (lifetime ends).


I need to know this, because the objects in my class do not contain sensible values all the time, so the destructors should not be called when they don't.

But, there seems to be a very significant problem with an object that can acquire a state where it cannot be destructed.