2012-01-11 7 views
0

以下のコードは、アレイダブルフリーまたは破損オブジェクト(別の...)を削除中

for (i = j; i > 0; i--) { 
    myBlk *tmp = blks[i]; 
    blks[i] = blks[i-1]; 
    blks[i-1] = tmp; 
    delete tmp; 
} 

の先頭に要素を移動する、私が取得:

*** glibc detected *** double free or corruption (out): 0x00007fffd556ad10 *** 

この文を削除しても問題はありません。しかし、私はメモリがリークするのを望んでいません...

+0

要素を移動するために何かを削除しているのはなぜですか? – Mysticial

+0

私はすべてを削除していません。ポインタがループ内に作成され、ループの最後にポインタが削除されます。 – mahmood

+1

メモリ割り当てがある場合にのみdeleteを呼び出します。この場合は、この場合は持っていません。ポインタをコピーしてもメモリが割り当てられていません。だからちょうど 'delete'を取り除いてください。 – Mysticial

答えて

1

回答のコメントを促進する。

メモリ割り当てをポインタコピーと混同しているようです。あなたのループでは、あなたはメモリ割り当てをしていません。ポインタをコピーするだけで、メモリを割り当てません。

だから、deleteを取り除く必要があります:メモリの割り当てがある場合

for (i = j; i > 0; i--) { 
    myBlk *tmp = blks[i]; 
    blks[i] = blks[i-1]; 
    blks[i-1] = tmp; 
} 

deleteだけ呼ばれて - あなたがのどれを持っていません。 (少なくともループ内にはありません)

+0

しかし、彼の配列/ベクトルは削除されなければならないポインタでいっぱいであると推測できます。 – CashCow

+0

@CashCow正しい、明確な答え。 – Mysticial

0

このコードは非常に奇妙に見えます。

私の推測は(あなたのコメントに基づいて "ポインタはループ内に作成され、ループの最後には削除されます。")私はdeleteが不必要であると思う。

delete tmpに電話するとtmpblks[i-1]の両方が同じメモリを指しているので、blks[i-1]が解放されます。ループの最後に有効なポインタが含まれ続けることが期待される場合は、deleteは確かに余計です。

+0

はい。ミスティカルはそれを説明した。 tahnks – mahmood

2

tmpは、配列の既存の要素を指しています。あなたはnewtmpを割り当てていません。したがって、tmpを削除する必要はありません。私は、元の配列要素が割り当てられ、どこか他の場所で解放されていると仮定しています。

0

毎回同じ要素を削除していますか?

削除した要素をi-1に移動してからiを減らします。

関連する問題