はい、ベクターは自分自身の後にクリーンアップすることができます。
HOWEVERスタッフベクタ保持がそれ自身の後にクリーンアップするのは信頼できません。クリーンアップする必要があるのは、アプリケーションの外部で持続するものです。その記憶があれば、これは心配ではありません。 XMLタグがすべて閉じていることを確認すると、OSはあなたを助けることができなくなります。例えば
、何がこのようないくつかのグラグラロックオブジェクトのベクトルがある場合:そのときに行わ
class CLock
{
public:
CLock() {}
~CLock() {}
void Lock(...) {...}
void Unlock(...) {...}
};
std::vector<CLock> myLockVec;
がどのように時計のノウハウのあなたのベクトルはすべてのロックを解除するでしょうか?ベクタはロックについて知るために構築されていません。
これはポインタのベクトルを持つと同じような状況は基本的に次のとおりです。
std::vector<int*> myIntVec;
どのようにベクトルがここにポインタ削除されているとNULL'd、そしてどれが本当に存在している知っているのですか?おそらくいくつかは削除され、特別な値0xdeadbeefに設定されています。つまり、削除されています。
ポイントはベクトルがこれを知る手段を持たないか、その要素がポインタまたはロックであることを知ることができません。それらは、デフォルトのコンストラクタを持ち、コピー可能なものである必要があり、ベクトルがその要素に持つ他の要件を満たしている必要があります。
解決策は、HOLDSベクタがクリーンアップを担当する必要があることを確認することです。これは、RAIIと呼ばれます。リソース割り当ては初期化です。ここで重要なことに、リソース破壊は割り当て解除です。上記のClockの例では、答えは明らかです。終了したら必ずアンロックしてください!
class CLock
{
...
~Clock()
{
if (locked)
{
Unlock();
}
}
}
しかし、そのポインタはそれほど明白ではありません。解決策は、smart_ptrクラスの中でポインタを包むことです。これらの中で最も多くはboost family of smart ponitersです。
class CSmartPointer<T>
{
CSmartPointer(T* rawPtr)
{
m_ptr = rawPtr;
}
~CSmartPointer()
{
delete m_ptr;
}
}
その他の機能は、このような参照カウントとしてポインタをプレイさせられるが、上記の例では、あなたの問題の性質の要点を与える必要があり、その一般的にどのように解決しました。
「プログラムを実行するたびにRAMが失われます」ということは、「プログラムを終了するまで使用可能なRAMが小さくなる」または「プログラムを終了しても利用可能なRAMが小さくなることを意味しますか?次回は走って、いつかはいつまでもRAMを残さないだろうか? –
私はマックスの質問をセコンディングしています。 Windows私は実際には、必要がない限り、終了したプログラムをアンロードしないと考えています。そうすれば、彼らは最初からすぐに立ち上がります。 –
"そして、私はちょうど心に浮かんだ3番目の質問は、ベクトルが自動的にヒープ上に作成された場合、なぜ新しいキーワードをそれらと一緒に使うのかということです。 ベクトルを現在のスコープ外のポイントに渡す必要がある場合にのみ、これを行う必要があります。これは実際には比較的稀です。 – rlbond