4

これにより、C++ でメモリ リークや未定義の結果が発生するのではないかと考えています。

string foo()
{
    char tempArray[30];
    strcpy(tempArray, "This is a test");
    return string(tempArray);
}

これが C の悪いことであることはわかっていますが、C++ の明確な答えは見つかりませんでした。

誰もがノーと言っていますが、メモリの割り当てがいつ解除されるかについて、私はまだ混乱していますか?

上記のメソッドを呼び出すこのメソッドがあるとしましょう

void bar()
{
    string testString = foo();
}

上記のコードのどの時点で、foo() から返された文字列オブジェクトはそのデストラクタを呼び出しますか? オブジェクトtestStringにコピーされた直後ですか?

4

6 に答える 6

2

いいえ、メモリリークはありません。すべてを行う必要はありません。ここにコードと同等のものがあります

string foo()
{
 return "This is a test";
}
于 2012-11-16T22:17:56.267 に答える
2

あなたの例で何が起こるかというと、署名付きのコンストラクター

string ( const char * s );

と呼ばれます。コンストラクターは、文字列のコピーに新しいメモリを割り当て、それをその新しいメモリにコピーします。文字列オブジェクトは、デストラクタが呼び出されたときに自身のメモリを解放する責任があります。

文字列のコピーを作成すると、コピー コンストラクターもメモリを割り当ててコピーを作成します。

RAIIパターンも参照してください。これがstringのメモリ管理のしくみです。

于 2012-11-16T22:21:43.740 に答える
2

このコードでは:

char tempArray[30];

tempArray自動保存期間を持つ変数です。「tempArray範囲外」になると、自動的に破棄されます。この配列の内容を (ややぎこちなく) にコピーし、std::stringそれstringを値で返します。その後tempArray、破壊されます。ここでtempArray 、配列であることに注意することが重要です。これは、配列の最初の要素へのポインターではなく (よく誤解されています)、配列自体です。が破棄されるためtempArray、配列が破棄されます。

次のように動的な保存期間を持つ変数を使用すると、リークが発生します。

  char* tempArray = new char[30];
  strcpy(tempArray, "This is a test");
  return string(tempArray);

new[]一致しないに注意してくださいdelete[]。ここで、tempArray引き続き自動保存期間を持つ変数ですが、今回はポインターであり、それが指すものは動的保存期間を持ちます。つまり、tempArrayスコープ外になると破棄されますが、それは単なるポインターです。それが指すもの -char配列自体は、あなたがそうしないので破壊されませんdelete[]

于 2012-11-16T22:27:03.397 に答える
1

特に効率的ではありませんが、いや、漏れはありません。

于 2012-11-16T22:16:02.620 に答える
1

いいえ、ヒープにメモリを割り当てないため、リークは発生しません。malloc,callocまたはnew..を使用し、 free/ deleteit を使用したことがない場合。はい、メモリリークです!

配列は静的に割り当てられるため、スタック上に作成されます。strcpy動的に割り当てられたオブジェクトを返すのではなく、既存の配列を埋めます。渡されたポインターのために、これを行う方法を知っています - 繰り返しますが、ヒープに割り当てられていません。文字列を返すと、文字列オブジェクトのコピーが作成されます。

于 2012-11-16T22:17:24.177 に答える
0

関数から常にローカル自動変数を値で返すことができます。どの型でも、これは安全である必要があります (コピー コンストラクターが安全でない場合を除きます)。

T foo()
{
   return T(...);
}

また:

T foo()
{
   T t
   return t;
}

あなたの例は私の最初のケースと一致します。

安全ではないのは、ローカル自動変数へのポインター/参照を返すことです。

T& foo()
{
   T t
   return t;
}

T* foo()
{
   T t
   return &t;
}
于 2012-11-16T22:20:26.790 に答える