5

複数の質問に気付きました.C++の専門家は、std::string/std::map/etc. 'new' キーワードを使用して作成しないでください (明らかでない場合は、C++ の初心者)。

したがって、私の理解が正しければ、これはヒープではなくスタックに作成されます。これは、関数が範囲外になった瞬間にオブジェクトが消えることを意味しますが、そうではないと私は信じており、私の理解は間違っています。

これは、基になるテンプレートがヒープ上でインスタンス化し、auto_ptr を使用して管理するため、メモリ リークが発生しないためですか? これはすべての stl クラスに適用されますか?

また、フォローアップの質問は、マップに挿入されるオブジェクトを作成する方法は何ですか? ヒープに割り当てる必要がありますか (関数の範囲外で価値がある場合)。

編集:

ヒープとスタックの違いと、それぞれを使用する理由を理解しています (おそらくこれについて明確ではありませんでした)。

私がこれを要求する理由は、保持したいオブジェクトのスタック上でオブジェクトをインスタンス化するだけでは不自然に思えるからです。しかし、これは構文がどのように見えるかだけだと思います。

つまり、書いているときにスタックに何かがあるような気がします。

std::map<int,int> mymap;

それ以外の、

std::map<int,int> *mymap = new std::map<int,int>;

これがメモリに与える影響についても疑問に思っています。この実装自体によってメモリがクリーンアップされるようになったので、Java のガベージ コレクションに似ていますか? stl オブジェクトを使用すると、暗黙のパフォーマンスへの影響はありますか?

4

2 に答える 2

15

これはstd::stringorに固有のものではありませんstd::map。これは、C++ のほとんどすべてのオブジェクトに関する単純な一般規則です。

リソース管理を自動化するには、通常、各リソースを、そのリソースが必要になる時間を含むスコープに結び付けます。一貫してこれを行うと仮定すると、各リソースは、実行が定義されたスコープを離れるときに自動的にクリーンアップされます。

これは、最も一般的には「RAII」(Resource Acquisition is Initialization) と呼ばれますが、よりわかりやすい用語である SBRM (Scope bound resource management) を使用する人もいます。使用する用語に関係なく、適切に (そして一貫して) 使用すれば、非常にうまく機能します。

「RAII」という用語の理由は、ほとんどのリソースがオブジェクトの構築中に取得され、オブジェクトの破棄中に解放されることを意味するためです。これは、それぞれが 1 つの特定のリソースの有効期間を管理するため、(とりわけ) オブジェクトが非常に粒状である、かなり特殊なスタイルのコーディングにつながる傾向があります。

于 2013-05-29T05:41:13.330 に答える
8

ヒープに何かを置く一般的な理由の 1 つは、コンパイル時にサイズがわからないため、不明な数のオブジェクトを割り当てる柔軟性が必要になることです。stringとおよびその他のコンテナーの内部実装はmap、必要に応じてヒープから自動的に割り当てられるため、負担が軽減されます。オブジェクト自体をヒープに置くことは冗長になります。

コンテナをヒープに配置する唯一の理由は、コンテナを作成するブロックよりも寿命を長くする必要がある場合です。

于 2013-05-29T05:53:17.323 に答える