コードは次のとおりです。
class x
{
int k;
};
int main()
{
x *p=new x[1000000];
return 0;// can be 1 too
}
ここで問題となるのは、メイン関数から出るときに、割り当てられたメモリがデストラクタを呼び出すコンパイラによって解放されるか、プロセスが存在しなくなるためにオペレーティングシステムによって解放されるかです。
コードは次のとおりです。
class x
{
int k;
};
int main()
{
x *p=new x[1000000];
return 0;// can be 1 too
}
ここで問題となるのは、メイン関数から出るときに、割り当てられたメモリがデストラクタを呼び出すコンパイラによって解放されるか、プロセスが存在しなくなるためにオペレーティングシステムによって解放されるかです。
デストラクタは呼び出されませんが、適切なオペレーティング システムであれば、機能していないプロセスのすべてのリソースを再利用します。ただし、標準には、実装に関するそのような要件はありません。
C++ は、指定しない限りメモリを解放しません。C++ で終了がどのように機能するかについてはあまり詳しくありませんが、ここですべてのメモリを解放しているのはオペレーティング システムであると確信しています。exit() 関数を呼び出すと、C++ で問題が解決される場合があります。
メモリは (コンパイラによって) 解放されません。デストラクタは呼び出されません。すべてのnew
(またはnew []
) には、対応するdelete
(またはdelete []
) が必要です。C++ ではメモリを管理できますが、これを処理する必要があります。ところで、プログラムの実行が終了すると、OS はリソースを再利用します (そのため、使用されていたメモリはシステムによって解放されます)。
A* a = new A;
delete a;
コンパイラによって次のように解釈されます。
// assuming new throws std::bad_alloc upon failure
A* a = ::operator new(sizeof(A));
a->A::A();
if ( a != 0 ) { // a check is necessary for delete
a->~A(); // DESTRUCTOR IS CALLED BY THE DELETE OPERATOR
::operator delete(a);
}
(ソース: http://www.codeproject.com/Articles/4795/C-Standard-Allocator-An-Introduction-and-Implement )
開発者として、これについては本当に責任を負うべきです。スマート ポインターを使用することをお勧めします。それはさておき、プログラムが終了すると、オペレーティングシステムがあなたのために片付けるはずです。C++ 言語自体は、割り当てたメモリを再利用するために何もしません。