2

ステートメントを含む関数 foo が与えられた場合:

void foo() {
  std::string * s;
}

この関数が戻った後、メモリは再利用されますか?

このポインターは何も指していないため、私はイエスと仮定していますが、何人かの人々はノーと言っています-それはダングリングポインターです.

4

3 に答える 3

10

std::string* s文字列への初期化されていないポインタです。関数 foo が戻ると、ポインターは破棄されます (ポインター自体がスタックに割り当てられたローカル変数であるため)。いいえstd::string作成されたことがないため、メモリリークは発生しません。

あなたが言うなら

void foo() {
    std::string * s = new std::string;
}

その後、メモリリークが発生します

于 2013-01-31T05:07:02.023 に答える
1

このコードは、C のような文字列について学び、C のイディオムを通じて C++ を使い始める場合に典型的なものです。

C++ クラス (特に標準ライブラリ クラス) は、オブジェクトをとして扱い、必要なメモリを自分自身で管理します。

std::string、この意味では と違いはありませんint。「テキスト コンテナー」が必要な場合は、std::string (not std::string*) を宣言し、それに応じて初期化します (初期化されていない std::strings は定義により空であり、デフォルトのコンストラクターです)。他の単純な型で行うように機能します。

std::string* 自体は、設計環境が悪いことの兆候です。

C++ の明示的な動的メモリは、通常、次の 2 つの状況で使用されます。

  • コンパイル時にオブジェクトのサイズがわからない (C 文字列のように、サイズが不明な配列の場合によくあることです)
  • コンパイル時にオブジェクトのランタイム タイプがわからない (そのクラスは実行時に他の入力に基づいて決定されるため)

現在、std:string は最初のポイントを管理し、2 番目のポイントをサポートしていません (仮想メソッドはありません)。そのため、動的に割り当てても値は追加されません。文字列オブジェクトを格納するためのメモリを自分で管理するためのすべての複雑さが追加されるだけです。それ自体が、実際のテキストを格納するための他のメモリのマネージャーです。

于 2013-01-31T09:01:15.550 に答える
0

このコードは、文字列値を含むメモリ内のどこかにポインタを作成するだけで、以前に割り当てられた場所を指し、新しい文字列を割り当てません。ポインター値にメモリを割り当てるだけで、関数が戻った後は無効になります...

于 2013-01-31T05:12:16.967 に答える