次のコードを検討してください。
#include "iostream"
#include "conio.h"
using namespace std;
class sample
{
private:
int i;
public:
sample(int ii=0) : i(ii){
cout<<"Constructing Object"<<endl;
}
~sample() { cout<<"Destructing Object"<<endl; }
void* operator new(size_t nSize, void* loc){
cout <<"Inside new"<<endl;
cout <<loc<<endl;
return loc;
}
void operator delete(void* ptr){
cout <<"Inside delete"<<endl;
free(ptr);
}
};
int main()
{
int intArr[2];
sample* samplePtr = new(intArr) sample(5);
cout <<samplePtr<<endl;
delete samplePtr;
// samplePtr->sample::~sample();
getch();
}
出力:
Inside New
0x22ff38
Constructing Object
0x22ff38
Destructing Object
Inside Delete
ここでは、すでにスタックに割り当てられているメモリを動的に要求しています。完了したら、デストラクタを明示的に呼び出す必要があることを読みました。しかし、スタックに割り当てられたメモリに対してdeleteを呼び出そうとすると、デストラクタが呼び出されます。これは、デストラクタが呼び出された後にスタック上のメモリが解放されることを意味しますか?
以前にヒープに割り当てられたメモリを動的に要求する場合、その場合はdeleteを呼び出す必要がありますが、deleteは実際にスタック上のメモリを解放しますか?