2012-03-28 15 views
1

これが私のコードです:C++ポインタ "エラー:ダブル無料または破損(アウト)"

uint16_t * ptemparr = new uint16_t[20]; 
for (int x=0;x<2;x++) 
{ 
    function(ptemparr); 
    ptemparr ++; 

} 
delete[] ptemparr; 

私はこのエラーを取得することを行うと:

double free or corruption (out) 

EDITED: ありがとうございましたIなぜこのエラーが発生するのか理解していますが、今はこれが良いアイデアだと思いますか?

uint16_t temparr[20]; 
uint16_t * ptemparr = temparr; 
for (int x=0;x<2;x++) 
{ 
    function(ptemparr); 
    ptemparr ++; 

} 

このように私はスタック上にポインタを作成し、メモリリークの問題はありません。 はまた、上記のコードは、そう私はあなたがnew []によって返されたdelete []に同じアドレスを渡す必要があり、このような状況

+0

インデックス作成に角括弧を使用しないのはなぜですか? – tartar

+0

funtionはptemparrの中に配列を返します。上のコードは説明のためのものです。実際には++はptemparr = ptemparr + 4 – Kam

+0

@Kamです。x(x = 20をコードスニペットに割り当てる)たとえ1秒に1回程度「むしろ」とは言えず、静的割り当てと動的割り当ての違いがその時間に消える傾向があるとしても、静的割り当てをうまく使用します。スタックやヒープを使用するのは味わいです。ブロックの外側でそのベクトルにアクセスする必要がある場合、ヒープは必須です。 – Enzo

答えて

4

のための最高のコーディングの練習に何を知らせる前に、このことを念頭に裸してください、すべての1秒を実行する必要があります。
また、function()が渡されたポインタ上で削除しないようにしてください。deallocate the memory by calling

+0

私の質問が更新されました:) – Kam

+0

@Kam:2番目のアプローチはより良いです.C++での動的割り当てを避けることは、常に良いアイデアです。実際には、C++コードの中で最も新しいものはnewです。すべて、決して生のポインタではありません。 –

0

forループで増分したので、ptemparrをそのホームアドレスにリセットする必要があります。だから、私はそれを削除する前に2減らすことをお勧めします。

ptemparr-=2;

+0

あまりにもclunky。 –

+0

@JonathonReinhartはかっこ悪いですか?==間違っていますか? – Kiril

+0

いいえ、それはうまくいくかもしれませんが、保守が難しく、将来のバグを尋ねるだけです。 –

0

あなたはnewによって返された同じアドレスをdeleteする必要があります。

私はいつも私のループを元のポインタのコピーでこの行にし、mallocまたはnewによって返された元のポインタを変更しません。

関連する問題