2

私は次のような関数fooを持っています

myType** foo(){

    myType **array = malloc( .... );
    //Do some stuff
    return array;
}

ここで私は malloc しましたが、返却しているので解放しませんでした。これによりメモリリークが発生しますか? 使用後、呼び出し関数で明示的に解放する必要がありますか?

4

4 に答える 4

5

(場所に関係なく) メモリを解放しない場合にのみ、メモリ リークが発生します。

この場合、free関数が呼び出されてポインターの処理が完了した後に行う必要があります。

しかし、これはCのやり方です。C++ では、スマート ポインターを返し、new代わりにmalloc.

于 2012-09-25T06:21:34.317 に答える
5

このタイプの関数では、呼び出し元は、ポインターが指すリソースの「所有者」です。そのため、呼び出し元はリソースを解放するか、他の誰かに渡す必要があります。

C++ では、リソースの割り当て解除を処理し、所有権を明確にするstd::vector、またはスマート ポインターなど、独自のリソースを管理する型を返すことをお勧めします。

この例を参照してください。心配する必要はありません。特に戻り値の最適化(NRVO)という名前のcopy elision についてすべて読んでください。

std::vector<std::vector<SomeType>> foo()
{
  std::vector<std::vector<SomeType>> tmp = ....;
  // do some stuff
  return tmp;
}
于 2012-09-25T06:22:02.857 に答える
2

メモリ リークは、メモリを解放しないことによって発生します。ある時点でメモリが解放される限り、メモリはリークされません。しかし、ポインターが「失われた」場合、または何らかの依存関係ループによって、メモリが役に立たなくなった後もメモリが残っている状況が発生した場合は、その時点でリークが発生しています。

通常、このような状況では、次のようなパターンを作成します。

void* mything_init() {
   void *obj = malloc(LEN);
   // do some initialization
   return obj;
}

void mything_uninit(void* thing) {
   // any teardown
   free(thing);
}

そのすべてについてmything、最終的にはそのオブジェクトを_init呼び出す必要があります。_uninitそれは、そのライブラリのユーザーとしてのあなたの責任です。そのライブラリの作成者として、 で割り当てたもの_initが で適切に解放されるようにし_uninitます。

malloc() は C イディオムであるため、これは C++ パターンではなく C パターンです。C++ はnewdeleteを使用します。この種の作業は、通常、コンストラクター/デストラクターのペアで行われます。

于 2012-09-25T06:32:26.660 に答える