1
int do_memory()
{
  int * empty_ptr = (int *) malloc(sizeof(int));
  *empty_ptr = 5;
  return *empty_ptr;
}
...
int b = do_memory();
free(&b); //obviously not valid

スコープ外になったときb、empty_ptrのメモリがまだ存在していると仮定するのは正しいでしょうか?しかし、解放することは不可能であり、したがってこれは悪いコードですか?

4

2 に答える 2

4

「int*empty_ptr」(割り当てられたメモリブロックへのポインタ)が解放されることはなく、do_memoryから戻り値を取得するだけです。

漏れがない場合は、これを使用してください

int* do_memory()
{
  int * empty_ptr = (int *) malloc(sizeof(int));
  *empty_ptr = 5;
   return empty_ptr;
}
...
int* b = do_memory();
int b_local = *b;
free(b); // valid

またはこれ(リークなし、スタック上の変数以外の割り当てなし、パフォーマンスへの影響なし):

void do_memory(int* RetValue)
{
  *RetValue = 5;
}
...
/// b is allocated locally on stack
int b;
do_memory(&b);
// no free() calls are needed
于 2012-06-04T17:51:32.227 に答える
2

関数のシグネチャが間違っています。次のように更新してください。

int* do_memory()
{
  // code
}

...

int* b = do_memory();

// At this point, freeing b is valid and will 
// release the resources previously allocated in do_memory()
free(b); // valid

ただし、そうしないで関数が終了すると、以前に割り当てられたメモリブロックを解放せずにfree(b)変数が破棄されます。bこれにより、割り当てを解除するメモリブロックへの参照がなくなったため、メモリリークが発生します。悪い、悪いコードです。

于 2012-06-04T17:51:39.770 に答える