数時間前、メモリリークの問題をいじっていましたが、仮想デストラクタに関する基本的な情報が間違っていることがわかりました。クラスのデザインについて説明します。
class Base
{
virtual push_elements()
{}
};
class Derived:public Base
{
vector<int> x;
public:
void push_elements(){
for(int i=0;i <5;i++)
x.push_back(i);
}
};
void main()
{
Base* b = new Derived();
b->push_elements();
delete b;
}
境界チェッカーツールは、派生クラスベクトルのメモリリークを報告しました。そして、デストラクタは仮想ではなく、派生クラスのデストラクタは呼び出されないことがわかりました。そして、驚くべきことに、デストラクタを仮想化したときに修正されました。派生クラスのデストラクタが呼び出されなくても、ベクトルは自動的に割り当て解除されませんか?それはBoundsCheckerツールの癖ですか、それとも仮想デストラクタの理解が間違っていますか?