-2

char* を返す関数があるとします。

char* GetName(int index);

そして、入力パラメーターとして char* を持つ別の関数があります

void PrintName(const char* name);

だから私がするなら

PrintName( GetName(10) );

メモリリークはありますか?はいの場合、なぜですか? そして、これがstd::string を使用せずにこれを処理する唯一の方法ですか:

char* name = GetName(10);
PrintName(name);
free(name);
4

6 に答える 6

1

GetName何が返されるかに依存します。

しかし、あなたが使用free( name )したように、私はそれが動的に割り当てられたメモリを返すと思います。

そうです、メモリリークがあります。

C++にはガベージコレクターがありません。メモリを割り当てる場合は、それを解放する必要があります。

または、スマートポインタを使用します。またはラッパー。

于 2012-11-07T08:41:34.597 に答える
1

この alloc/dealloc を手動で行うと、注意しないと問題が発生します... std:string のようなものを使用するのが最善です。

とは言っても、GetName 内で char * が割り当てられている場合は、外部で削除する必要があります。これは所有権のように考えることができます: GetName は char* を返すことで所有権を譲渡します。PrintName が所有権を取得することを決定してから、それを削除するか、最後の例で示した方法でそれを行うことができます。

より簡単なアプローチの 1 つは、(できればスタック上で) 事前に割り当てることです。

char name[TheSizeYouNeed];
PrintName (GetName(10, name));

GetName は次のようにします。

char *GetName (int len, char *buf) {
  strcpy (buf, "xxx");
  return buf;
}
于 2012-11-07T08:48:43.333 に答える
1

GetName() によって返されたメモリ領域を free() する限り、メモリ リークではありません。しかし、すべては GetName(); 内で何が起こっているかに依存します。

于 2012-11-07T08:42:17.560 に答える
1

あなたが共有したものから、メモリリークと呼ばれるものはありません。メモリをまだ割り当てていないため、リークする可能性があります。いくつかのメモリを割り当てて渡すことができると指定しました。

つまり、要するに、関数内に何を書くかによって完全に異なりますGetName&PrintName

于 2012-11-07T08:42:20.730 に答える
1

それは簡単です、すべてmallocが a 、freeすべてnewが a delete、すべてnew[]delete[]あなたは何をするのかは言いませんGetNameが、私はそれが使用されたと仮定していmallocます. その場合、 を呼び出さないため、メモリ リークが発生しますfree

コードの 2 番目の部分は、メモリ リークを回避する 1 つの方法です。もう 1 つの方法は、呼び出すことfreeです(動的に割り当てられたメモリなしPrintNameでは呼び出すことができないため、おそらく良い考えではありません)。PrintName

もちろん、これが難しいからこそ、使用をお勧めしますstd::string

于 2012-11-07T08:42:51.260 に答える
0

あなたが書いたものからそれを判断するのは難しいです。基本的に、mallocキーワードを使用しない場合は、呼び出す必要はありませんfree。スタックに割り当てられた (つまり、 を使用せずにmalloc) メモリは、そのスコープが終了すると解放されます。

GetNameしかし、内部でusingを割り当てた場合malloc、NOT 呼び出しfreeによってメモリ リークが発生します。

したがって、次のようになります。

  • 使わなければmalloc漏れません。
  • フリーコールを使っていて使わmallocなかったら漏れてしまいます。
于 2012-11-07T08:44:47.197 に答える