2016-07-16 7 views
-4

私はC++で新しいと削除を使うべきだと知っていますが、なぜmallocを使うのは良い考えですか?解放されたポインタは、reallocとmallocでコンストラクション関数に割り当てられませんでした。

+3

ここで間違っていることがたくさんあります。私はどこから始めたらいいのか分かりません。サイズが0のmallocです。 C++コードで 'malloc'と' free'を使います。最初は不必要な動的割り当てです。リストはちょっと変わっていません。 –

+0

mallocを1のサイズで修正しても、それでもエラーmsgが表示されます。 C++はCスタイルと互換性があります。なぜそれをC++で使うことができないのですか? – beasone

+0

私は 'realloc'を使う理由を理解しています。しかし、クラスのコンストラクターでミューテックスを誤ってラッチしていると考えられる理由を知りたいのですが、同じことがインスタンスメンバー変数だけを変更しています。あなたは、複数のスレッドが同じオブジェクトを同時に構築することを期待していますか?あるいは、あなたが 'add'メソッドのようにラッチされていると思いますが(あなたのやっている方法ではない)、mutexを無視していると思います。あなたの所見を再現する必要がない場合は、あなたの投稿でそれを取り除く。 – WhozCraig

答えて

1

According to the documentation

realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize)); 

dataPoolBufferを再割り当てしますが、どこdataPoolBufferポイントは変更されません。だから、dataPoolBufferが現在無効なメモリを指しているというオッズはかなり良いです。

dataPoolBuffer = (char*)realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize)); 

あなたがしたいことをやり遂げますが、どのようにこれをやっているのか考え直してください。あなたは多くの痛みのために自分自身を設定しています。 Your class violates The Rule of Three, for one thing.std::vectorは、あなたのためのコンテナのサイズ変更とメモリ管理をすべて扱います。

+0

私は "ataPoolBuffer = realloc(dataPoolBuffer、sizeof(char)*(dataPoolSize));"を試みました。 Xcodeでは、互換性のない型 'void'から 'char *'に代入しています。 – beasone

+0

@beasone良い点。私はこのギャグが正当なCに落ちた。余分なキャストが必要です。修正する。 – user4581301

1

realloc()を呼び出すときは、ポインタ変数に結果を戻す必要があります。 realloc()はしばしばメモリを新しい場所に移動する必要があり、その場所を返します。あなたのコードは、変数が古い場所を指し示しているままになり、その後にそれを使用しようとすると未定義の動作が発生します。

だから、それは次のようになります。

dataPoolBuffer = (char*)realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize)); 

flagBuffer = (char*)realloc(flagBuffer, sizeof(char)*(dataPoolSize)); 
+0

私は "ataPoolBuffer = realloc(dataPoolBuffer、sizeof(char)*(dataPoolSize));"を試しました。 Xcodeでは、互換性のない型 'void'から 'char *'に代入しています。 – beasone

+0

C++では明示的にキャストを使用する必要があることを忘れています。 – Barmar

関連する問題