0

私のアプリケーションでは、unsigned char*を使用して変数 ( )malloc()にメモリを割り当てました。デストラクタでそのメモリの割り当てを解除しようとすると、この条件を使用して二重の破損を回避します。

unsigned char *wsqData;
wsqData= (unsigned  char *)malloc( 10000*sizeof( unsigned char));

私のデストラクタで

  if(wsqData!=NULL)
  {
      free(wsqData);
      wsqData=NULL;
  } 

今問題は、デストラクタの前にメモリを解放したときです。この「条件」が正しく機能しなかった場合、もう一度その変数を解放しようとすると、二重破損エラーが発生します。このシナリオの問題は何ですか?

4

4 に答える 4

5

メモリを呼び出しfreeてもポインタは自動的に に設定されないNULLため、条件は無意味です。wsqData解放するNULL場所に設定する必要があります。

もちろん、NULLポインターで free を呼び出すことは安全であることが保証されているため、とにかく条件は無意味です。

于 2012-04-23T08:19:31.320 に答える
3

デストラクタの外側でメモリを解放する時点でに設定wsqDataする必要があります。NULLただし、C++ では and を使用する必要がnewありdeleteます。また、デストラクタ以外の場所でメモリを解放しないようにしてください。

于 2012-04-23T08:19:08.247 に答える
0

他の人が示したように、解放するたびに NULL に設定する必要もあります。関数にします - var を解放してから NULL に設定し、デストラクタとプログラム内の任意の場所の両方から呼び出します。

于 2012-04-23T08:29:15.873 に答える
0

参考までに: これはダングリング ポインターの典型的な例です。提案どおりに設定wsqDataする必要があります。NULL

于 2012-04-23T09:23:36.507 に答える