今日、私は C++ メモリ管理について何も知らないことがわかりました。このコードを見てください:
class A
{
public:
A(){std::cout << "constructor called" << this << std::endl;}
~A(){std::cout << "destructor called" << this << std::endl;}
void test (){std::cout << "test" << this << std::endl;}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
A *aa = new A();
delete aa;
aa->test();
aa->test();
aa->test();
std::cout << "still works\n";
return a.exec();
}
なぜクラッシュしないのですか?デストラクタが呼び出されたにもかかわらず実行を続けるのはなぜですか? メソッドを呼び出すtest
と、アプリに属さないメモリを処理します。
aa = NULL;
さらに驚くべきことは、の直後に挿入しても機能することですdelete aa;
。test
メソッドは問題なく呼び出されます。私は完全に混乱していることを告白する必要があります。デストラクタの目的と、効果がない場合に NULL を割り当てる目的は何ですか?