0

私はこれをボイドで使用しています:

unsigned char *nEncodedBytes = NULL;
nEncodedBytes = new unsigned char[m_lLenCompressedBytes];

short *shrtDecoded = NULL;
shrtDecoded = new short[iCountDecodedShorts];

short *m_ShortOut;
m_ShortOut = (short*)malloc(( 960*6)*sizeof(short));

unsigned char *m_DataBytes;
m_DataBytes = (unsigned char*)calloc((960*6),sizeof(char));

完了したら、次を使用してメモリを解放します

delete (nEncodedBytes);
delete (shrtDecoded);

    free(m_DataBytes);
    free(m_ShortOut);

これでいいですか?ある場所で delete を使用し、別の場所で free を使用した理由がわかりません。コードをコピーしました。

メモリリークはありますか?

ありがとうございました。

4

4 に答える 4

4

使うfreeときに使いますmallocmallocおそらく、 C++ ではまったく使用しないでください。これは C のやり方であり、C++ ではめったに必要ありません。

deleteで割り当てるときに使用しますnewnewコンストラクタを呼び出してメモリを割り当てdelete、デストラクタを呼び出してメモリを解放します。したがって、これらはオブジェクト指向の C++ オプションです。ただしシワがあります。C++ の実装では、配列を割り当てた場合、ポインターが配列を参照するのか単一のオブジェクトを参照するのかがわからないため (例: nEncodedBytes = new unsigned char[m_lLenCompressedBytes];)、それを解放するdelete[]代わりにを使用する必要があります。delete

呼び出しに失敗するとdelete[]、配列内の最初のオブジェクトのデストラクタのみを呼び出すことになるため、この特定のケースでは、デストラクタがないため、呼び出しdelete[]と呼び出しの結果に違いはないはずです。deletechar

コードにメモリ リークは見られませんが、すべてのコードを投稿していないため、わかりません。

于 2013-10-09T15:49:29.700 に答える
2

使用する必要があります

delete [] nEncodedBytes;
delete [] shrtDecoded;

アレイを削除しているとき。

于 2013-10-09T15:45:10.210 に答える
2

mallocand を混在させないでくださいnew(最初は文体上の理由から、次に-ed メモリーまたは-ed ゾーンを使用しdeleteて  はならないため)。標準のC++ コンテナーの使用を検討してください。メモリを明示的に割り当てる必要さえありません (ライブラリが割り当ててくれます)。コーディングできますmallocfreenew

std::vector<char> nEncodedBytes;
nEncodedBytes.resize(encodedbyteslen);

Linux では、valgrindを使用してメモリ リークを探します。ところで、おそらくhereのようなアロケータを使用して、Boehm の GCに興味があるかもしれません。

ところで、自分自身を使用するときmallocは、少なくともその結果を常にテストする必要があります

 SomeType* ptr = malloc(sizeof(SomeType));
 if (!ptr) { perror("malloc SomeType"); exit(EXIT_FAILURE); };

malloc失敗する可能性があることを覚えておいてください。テスト目的で利用可能なメモリを制限したい場合があります (例: ターミナルで) (例: make ulimit -m-or - failをより簡単にして、その種の失敗を十分に処理できるようにするため)。bashmallocnew

于 2013-10-09T15:45:28.117 に答える