私は次のような関数fooを持っています
myType** foo(){
myType **array = malloc( .... );
//Do some stuff
return array;
}
ここで私は malloc しましたが、返却しているので解放しませんでした。これによりメモリリークが発生しますか? 使用後、呼び出し関数で明示的に解放する必要がありますか?
私は次のような関数fooを持っています
myType** foo(){
myType **array = malloc( .... );
//Do some stuff
return array;
}
ここで私は malloc しましたが、返却しているので解放しませんでした。これによりメモリリークが発生しますか? 使用後、呼び出し関数で明示的に解放する必要がありますか?
(場所に関係なく) メモリを解放しない場合にのみ、メモリ リークが発生します。
この場合、free
関数が呼び出されてポインターの処理が完了した後に行う必要があります。
しかし、これはCのやり方です。C++ では、スマート ポインターを返し、new
代わりにmalloc
.
このタイプの関数では、呼び出し元は、ポインターが指すリソースの「所有者」です。そのため、呼び出し元はリソースを解放するか、他の誰かに渡す必要があります。
C++ では、リソースの割り当て解除を処理し、所有権を明確にするstd::vector
、またはスマート ポインターなど、独自のリソースを管理する型を返すことをお勧めします。
この例を参照してください。心配する必要はありません。特に戻り値の最適化(NRVO)という名前のcopy elision についてすべて読んでください。
std::vector<std::vector<SomeType>> foo()
{
std::vector<std::vector<SomeType>> tmp = ....;
// do some stuff
return tmp;
}
メモリ リークは、メモリを解放しないことによって発生します。ある時点でメモリが解放される限り、メモリはリークされません。しかし、ポインターが「失われた」場合、または何らかの依存関係ループによって、メモリが役に立たなくなった後もメモリが残っている状況が発生した場合は、その時点でリークが発生しています。
通常、このような状況では、次のようなパターンを作成します。
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++ はnew
とdelete
を使用します。この種の作業は、通常、コンストラクター/デストラクターのペアで行われます。