9

私は人々と彼の会社のデータベースを実装するプログラムを持っています。クラス メンバーの動的配列ではなく、クラス メンバーへのポインターの動的配列を作成しました。

機能するバージョンがありますが、valgrind はデストラクタで削除の不一致を示します (delete db)

CCompany** db;

~CCompanyIndex ( void )
{
    for(unsigned i=0;i<len;i++)
    {
        /*cout<<"dealloc:"<<db[i]<<endl;*/
        delete db[i];
    }
    delete db;
}

CCompanyIndex ( void )
{
    max=1000;
    len=0;
    db=new CCompany*[max];
}

追加にも使用します

CCompany* newIt=new CCompany(oName,oAddr,cName,cAddr);

だから私は以前に正しいと思う次のコードを試しました

~CCompanyIndex ( void )
{
    delete [] db;
}

ただし、メソッドを追加することによって割り当てられたすべてのメモリは割り当て解除されません。

4

3 に答える 3

17

最初のサンプルはほぼ正しいです。ループ内の各要素を削除していますが、配列forを試みています。delete

for(unsigned i=0;i<len;i++) { delete db[i]; }
delete db;

代わりに次のようにする必要があります。

for(unsigned i=0;i<len;i++) { delete db[i]; }
delete[] db;

を使用するときはいつでもnew ...[]、を使用する必要がありますdelete[]

また、3 (または5 (または0 ))のルールを忘れないでください。

于 2013-03-19T22:48:46.107 に答える
5

間違った を使用していdeleteます。これを行う:

CCompanyIndex::~CCompanyIndex()
{
    for(unsigned i=0; i<len;i++) delete db[i];
    delete [] db;
}

delete []呼び出しに注意してください。

于 2013-03-19T22:49:57.720 に答える
1

delete db[i]各要素が必要ですがdelete[] db、配列自体が必要なので、どちらのデストラクタも正しくありませんでした。

で割り当てられnew Foo[n]た配列は、配列形式で割り当てを解除する必要があります, , これは、新規/削除の不一致についての意味delete[]ですvalgrind

于 2013-03-19T22:48:58.613 に答える