vector<char*> x;
私のコードには多くのベクターがあります。しかし、メモリ使用量を最小限に抑えるために、それらを削除する必要があります。私は "shared_array"を使用するような解決策があることを知っていますが、他のライブラリをインポートすることはできません。ベクトルを使用した後にメモリリークを防ぐ良い解決策はありますか?ライブラリをインポートせずにベクターを削除する方法
vector<char*> x;
私のコードには多くのベクターがあります。しかし、メモリ使用量を最小限に抑えるために、それらを削除する必要があります。私は "shared_array"を使用するような解決策があることを知っていますが、他のライブラリをインポートすることはできません。ベクトルを使用した後にメモリリークを防ぐ良い解決策はありますか?ライブラリをインポートせずにベクターを削除する方法
C++ 11は、shared_ptr
などのスマートポインタオブジェクトをサポートしているので、Boost(または他のもの)を使う必要はありません。
johnathonが言ったように、char *
をスマートポインタet voilaでラップするだけで、それ以上心配する必要はありません。
std::vector<std::unique_ptr<char*>> x;
または
std::vector<std::shared_ptr<char*>> x;
要素は、いずれかの方法で、ベクターから除去する(.delete()
、.erase()
、...)、または単にベクトルが破壊されたときに、あなたのバッファが解放されますとき。
STL実装またはコンパイラがこのC++ 11機能をまだサポートしていない場合は、独自のスマートポインタタイプをロールすることもできます。例えば、this tutorialを参照してください。
コードスニペットでは、charポインタのベクトルを使用しています。私はそれらのポインタが新しいを介して割り当てられていると仮定し、それらは削除によって解放する必要があります。ベクトルが範囲外になると、そのベクトルは解放されますが、それらのchar配列はすべて解放されません。手動でそれらを解放する必要があります。
std::string
、特にvector<std::string>
を使用することもできます。このようにして、ベクトルが範囲外になると、すべての文字列が自動的に削除されます。
もしOPがchar *を使って正確に文字列でないものを表現していたら... TCP接続からのパケット?ベクトル
TCPパケットを表すのにchar *が「ベスト」であるのはなぜですか?完全に状況に依存します。パッケージを表現するためのクラスを持つことができます。手動でメモリを管理する必要はありません。 – stijn
私はもっと単純な仮定を使用しました。その場合、彼はベクトルをたどってすべてのメンバを 'delete [] 'するだけでよいのです。 'vector'はそれ自身の後でクリーンアップすることができますが、普通の古いポインタを使用している場合、ベクトルはそれらをクリーンアップしません。自分で削除する必要があります。 – Ove
あなたは
//Create
vector<char*>* _vec = new vector<char*>(5);
//Fill with something
for(unsigned int i=0; i<_vec->size(); ++i)
(*_vec)[i] = new char[100];
....
//Delete
for(unsigned int i=0; i<_vec->size(); ++i)
delete[] (*_vec)[i]; //Deleting array of char
delete _vec; //but not delete[] as we deleting only one instance of vector
ベクトル> Xを使用することができます。あなたがベクトルを使って終わったら、x.clear(); –
johnathon
完了したら手動で削除するだけですか?あるいは、あなた自身の 'shared_ptr'クラスを書いてください。 – jli
@ johnathon:答えとして投稿してみませんか? – Tibor