2012-01-21 9 views
0

私は複数のバッファを使用するC++プログラムで作業していますが、プログラムを実行するには数分のエラーが発生します。私はそれについて正しい方法を確信しています。私は私に障害を与えていると思うのコードは次のような現在:Mallocと複数のポインタを解放する

int *myBuf1, *myBuf2; 
myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize); 
myBuf2 = myBuf1; 
// do work 

if(myBuf1) { 
    free(myBuf1); 
} 
myBuf1 = NULL; 
myBuf2 = NULL; 

私の最初の質問は次のとおりです。代入「myBuf2 = myBuf1」で、はsizeof(int型)で、メモリの異なるブロックを割り当てるmyBuf2ん* maxPacketSize、またはそれはmyBuf1によって割り当てられた同じメモリブロックへのポインタですか?

次に、myBuf2とmyBuf1を解放してから、両方をNULLに設定する必要がありますか?私はmyBuf1だけを解放しています。または、それを行うのが最善でしょうか:

myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize); 
myBuf2 = (int*)malloc(sizeof(int) * maxPacketSize); 

無料ですか?

+3

これはC++よりもCに見える – Pubby

+2

なぜC++で 'malloc'と' free'を使用していますか? segfaultがどこから来ているのか分かりませんか? gdbでアプリケーションを実行します。クラッシュの原因となっている関数を見つけるには 'bt'を使います。変数を監視する。 'free'の前のチェックは役に立たない。さもなければ、問題は '仕事をする'になければなりません。表示するコードは重大な問題ではありません。 – pmr

+2

コンパイラの警告をオンにしてください。コンパイラが間違っていることを知らせる前に何が間違っているかを伝えると、事がより簡単になります。 –

答えて

5

Q:割り当てが 'myBuf2 = myBuf1'の場合、myBuf2は 異なるメモリブロックを割り当てますか?

A:いいえ

Q:第二に、私はmyBuf2解放されなければならないだけでなく、myBuf1?

A:いいえ1つのmalloc()、1つのfree()。

Q: [Should I] then set both to NULL? 

回答:すべてのポインタをNULLに設定することを強く推奨します。

+1

ポイントに;) – Goz

+1

実際には悪いです... 'myBuf2'は' int' *ポインタではありません。 'sizeof(int)== sizeof(int *)'という保証はありません(実際には、64ビットシステムでは保証されていません) - コンパイラはgit goからこのことについて不平を言わなければなりません。 –

+0

はい、あなたは正しいです、それはタイプミスです..それは両方のint *であるはずです。 – Al5678

2

まず、2つのポインタを宣言していません。

int *myBuf1, myBuf2; 

これはmyBuf1int(ないポインタ)としてint*ようmyBuf2を宣言する。

int *myBuf1, *mBuf2; 

第二には、いや、メモリをコピーしません別のポインタを割り当て、それだけで同じものを指す2つのポインタを作成します:あなたが記述する必要があります。

あなたはfreeが必要です。また、後でNULLに設定する必要はありませんが、いくつかのトリッキーなバグを回避するのに役立つこともあります。

+2

彼が必要とするのは、各変数を独自の行に入れることです; –

1

myBuf1からmyBuf2を割り当てると、myBuf2は、単にmyBuf1と同じ場所を指します。

myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize); 
myBuf2 = (int*)malloc(sizeof(int) * maxPacketSize); 

をしてからmyBuf1 = myBuf2;はただ理由もなくmyBuf2にメモリを割り当てることになります。そのため、これを行います。

結論:いずれか1つを解放するだけで十分です。

あなたのmyBuf2はちょうどintで、int*ではありません。おそらくsegfaultの原因になっています。

int *myBuf1, *myBuf2; 

+0

申し訳ありませんが、それはタイプミスです。int * – Al5678

0

変更

int *myBuf1, myBuf2; 

あなたはメモリの別々のブロックに持たせたい場合は、2つの別々の割り当てが必要になります。

myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize); 
myBuf2 = (int*)malloc(sizeof(int) * maxPacketSize); 

callocを使用することを検討してください。行の後

+0

ありがとうございました。私はcallocを読み上げます。また、それはtypoだった* myBuf2 – Al5678

0

myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize); 

あなたなければならないのmalloc()が失敗したことを示す、NULLポインタを返しませんでしたことをチェック。例えば:

myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize); 
if (myBuf1 == NULL) { 
    printf ("malloc () failed!\n"); 
    exit(1); 
} 
+0

ありがとう、これは私が実装する良い点検です。 – Al5678

0

Qは:[私はべき]その後、両方がNULLに設定しますか?

回答:はい、すべてのポインタをNULLに設定することを強く推奨します。

ブロック内にいる場合は、nullポインタを戻すように設定する必要はありません。コンパイラにとっては何もしていませんが、読者にとってはもっと混乱します。

C++では、ブロックを使用して識別子(特にポインタ)の範囲を制限することをお勧めします。

関連する問題