2013-03-19 51 views
7

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

私は動作しますが、valgrindの不一致はデストラクタで削除を示すバージョン(デシベルを削除)

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; 
} 

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

+3

(1)あなたは[三の規則](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)に精通していますか? (2)生ポインタと動的に割り当てられたメモリの代わりにスマートポインタとコンテナを考慮しましたか? –

答えて

11

最初のサンプルはほぼ正しいです。 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[]を使用する必要があります。

また、Rule of Three(またはFive(またはZero))も忘れないでください。

+3

または0 ......... – juanchopanza

1

あなたは、アレイ自体の各要素のdelete db[i]しかしdelete[] db必要があるので、どちらもデストラクタは正しかったです。 new Foo[n]に割り当てられた

配列は、それはあなたが間違っdeleteを使用している

+1

さらに、 'new []'や 'delete []'を使わないでください。ベクトルを使用して満足してください。 –

2

を削除/ valgrindが不一致新しいについて何を意味するかだ、配列形式、delete[]で割り当て解除する必要があります。これを行う:

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

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