2012-03-15 12 views
-1

ショートストーリー。 。 。私は、新しい演算子と削除演算子をオーバーライドしようとしています。新しいオン大丈夫であるように見えるが、上の私は、コード「スカラー削除デストラクタ()」をオーバーライドするにはどうすればよいですか?

cCellList::~cCellList() 
{ 
    STPINT loop; 
    for (loop = 0; loop < count; loop++) 
    { 
    delete cells[loop]; 
    } 
    free(cells); 
} 

のこのビットに問題があるdelete演算子を削除し、私のオーバーライドさに行くされていないものが出て働いていないので、ここで削除します。スタックトレースは、コードの行が実行されている

ExeName.exe!Cell::'scalar deleting destructor'() 
ExeName.exe!cCellList::~cCellList() 
ExeName.exe!Cell::'scalar deleting destructor'() 

cellsがタイプcCellList *である

delete cells 

であると言います。

ロングストーリー。私はこの実行可能ファイルを約20年間パートタイムで作業しており、ソースコードは約14 MBです。 VS2010を現在使用しているすべてのアンマネージドC++。私は、「オブジェクト指向の拡張機能を持つThinkC」という名前のコンパイラを使い始めました。おそらくあなたの多くは、あまりにも若いので、その日を覚えていないでしょう。

メモリ管理の問題があり、時には奇妙なことが起こることがあります。 Purifyのようなサードパーティーのソリューションをこのプログラムで使用できるようになってから、私は長い間、このポイントを通過しました。彼らは私がコードをインスツルメントしようとすると爆発するだけです。だから私は自分のmalloc/freeを書いており、メモリに何が起こっているのかをよりよく追跡するために、これらを接続しています。これまでのところ、私は自分のシステムですべてのメモリを割り当てていますが、この場合、予測可能な結果で、私の代わりに通常の "フリー"になります。

+2

> 20年以上コーディングしている場合は、最小限のテストケースを作成する方法を知っておく必要があります。 1つを作成し、ここに投稿してから、お手伝いしてください! –

+0

この質問も参照してください:http://stackoverflow.com/questions/4948339/why-is-a-scalar-deleting-destructor-being-called-as-a-result-of-vector-delete-on。 –

+0

あなたは20年近くコーディングしてきましたが、あなたは "自分のmalloc/freeを書く"していて、C++で 'operator new'のオーバーロードを扱う方法を知らないのですか? –

答えて

1
free(cells); 

mallocでメモリを割り当てましたか?

もしそうなら、それをしないでください。クラスはmallocでうまくいきません。理由のためnewが存在します。ここで間違っていることがあります。

いいえの場合は、freeで割り当てを解除しないでください。それは未定義の動作です。 cells = new Cell[n]に割り当てを書き込んだ場合は、割り当てを解除するにはdelete[] cellsを使用する必要があります。 freedeleteまたはの代わりに使用できません。また、の代わりにdeleteを使用することはできません。また、その逆の場合でも、どのように組み合わせても問題ありません。それは大丈夫ではありません。

0

delete演算子の宣言は何ですか?

オーバーライドされたmalloc()/ free()は、オーバーライドされたグローバルなnew()/ delete()演算子の形式をとり、ベクトルバージョンを提供することを忘れないでください。同様に、このデストラクタはfree(cells)の代わりにdelete[] cells;を呼び出す必要があります。新しいセル[X]を使って 'cells'を初期化したとします。そうでなければ何も動作しません。

関連する問題