Robz
Robz

Reputation: 1767

how much does the default destructor do

Does the default destructor in C++ classes automatically delete members that are not explicitly allocated in code? For example:

class C {
  public:
    C() {}
    int arr[100];
};

int main(void) {
  C* myC = new C();
  delete myC;
  return 0;
}

Does delete myC deallocate myC's arr automatically? Or do I need to write C's destructor to do this explicitly?

Upvotes: 13

Views: 14663

Answers (5)

bruce
bruce

Reputation: 29

You don't have to write a destructor. C++ class has the default destructor to delete the object after 'return 0' to recycle the memory.

Upvotes: -2

Jerry Coffin
Jerry Coffin

Reputation: 490138

If your class/struct contains a pointer, and you explicitly allocate something for that pointer to refer to, then you normally need to write a matching delete in the dtor. Members that are directly embedded into the class/struct will be created and destroyed automatically.

class X { 
    int x; 
    int *y;
public:
    X() : y(new int) {}
    ~X() : { delete y; }    
};

Here X::x will be created/destroyed automatically. X::y (or, to be technically correct, what X::y points at) will not -- we allocate it in the ctor and destroy it in the dtor.

Upvotes: 5

Cramer
Cramer

Reputation: 1795

Anything that you call new for must have a corresponding delete. If you didn't call new to create an instance of something then you don't have to call delete.

Upvotes: 0

Mark Ransom
Mark Ransom

Reputation: 308196

The implicitly defined (default) destructor will call the destructor for each member. In the case of a member array, it will call the destructor for each element of the array.

Note that pointers don't have destructors; you need to manually delete them. You don't have this problem in the provided example, but it's something to be aware of.

Upvotes: 6

Ben Voigt
Ben Voigt

Reputation: 283644

The constructor (in the absence of any ctor-initializer-list) calls the default constructor for each subobject.

Since you have no base classes and your member variables are primitive types, it will do nothing at all.

Same with the destructor. Yours is implicitly compiler-generated since you haven't declared one, and it will call the destructor for each subobject. Again that's trivial because your only subobject is an aggregate of primitives.

Now, all memory of the class will be freed when you delete it. Since the array is embedded inside the class, it's part of the same memory region and will be freed at the same time.

Upvotes: 12

Related Questions