ステートメントを含む関数 foo が与えられた場合:
void foo() {
std::string * s;
}
この関数が戻った後、メモリは再利用されますか?
このポインターは何も指していないため、私はイエスと仮定していますが、何人かの人々はノーと言っています-それはダングリングポインターです.
ステートメントを含む関数 foo が与えられた場合:
void foo() {
std::string * s;
}
この関数が戻った後、メモリは再利用されますか?
このポインターは何も指していないため、私はイエスと仮定していますが、何人かの人々はノーと言っています-それはダングリングポインターです.
std::string* s
文字列への初期化されていないポインタです。関数 foo が戻ると、ポインターは破棄されます (ポインター自体がスタックに割り当てられたローカル変数であるため)。いいえstd::string
作成されたことがないため、メモリリークは発生しません。
あなたが言うなら
void foo() {
std::string * s = new std::string;
}
その後、メモリリークが発生します
このコードは、C のような文字列について学び、C のイディオムを通じて C++ を使い始める場合に典型的なものです。
C++ クラス (特に標準ライブラリ クラス) は、オブジェクトを値として扱い、必要なメモリを自分自身で管理します。
std::string
、この意味では と違いはありませんint
。「テキスト コンテナー」が必要な場合は、std::string (not std::string*
) を宣言し、それに応じて初期化します (初期化されていない std::strings は定義により空であり、デフォルトのコンストラクターです)。他の単純な型で行うように機能します。
std::string* 自体は、設計環境が悪いことの兆候です。
C++ の明示的な動的メモリは、通常、次の 2 つの状況で使用されます。
現在、std:string は最初のポイントを管理し、2 番目のポイントをサポートしていません (仮想メソッドはありません)。そのため、動的に割り当てても値は追加されません。文字列オブジェクトを格納するためのメモリを自分で管理するためのすべての複雑さが追加されるだけです。それ自体が、実際のテキストを格納するための他のメモリのマネージャーです。
このコードは、文字列値を含むメモリ内のどこかにポインタを作成するだけで、以前に割り当てられた場所を指し、新しい文字列を割り当てません。ポインター値にメモリを割り当てるだけで、関数が戻った後は無効になります...