I defined a class foo as follows:
class foo {
private:
static int objcnt;
public:
foo() {
if(objcnt==8)
throw outOfMemory("No more space!");
else
objcnt++;
}
class outOfMemory {
public:
outOfMemory(char* msg) { cout << msg << endl;}
};
~foo() { cout << "Deleting foo." << endl; objcnt--;}
};
int foo::objcnt = 0;
And here’s the main function:
int main() {
try {
foo* p = new foo[3];
cout << "p in try " << p << endl;
foo* q = new foo[7];
}catch(foo::outOfMemory& o) {
cout << "Out-of-memory Exception Caught." << endl;
}
}
It is obvious that the line “foo* q = new foo[7];” only creates 5 objects successfully, and on the 6th object an Out-of-memory exception is thrown. But it turns out that there’s only 5 destructor calls, and destrcutor is not called for the array of 3 objects stored at the position p points to. So I am wondering why? How come the program only calls the destructor for those 5 objects?
Destructors are only called for the fully constructed objects – those are objects whose constructors completed normally. That only happens automatically if an exception is thrown while
new[]is in progress. So in your example the destructors will be run for five objects fully constructed duringq = new foo[7]running.Since
new[]for the array thatppoints to completed successfully that array is now handled to your code and the C++ runtime doesn’t care of it anymore – no destructors will be run unless you dodelete[] p.