2012-05-05 10 views
1
vector<char*> x; 

私のコードには多くのベクターがあります。しかし、メモリ使用量を最小限に抑えるために、それらを削除する必要があります。私は "shared_array"を使用するような解決策があることを知っていますが、他のライブラリをインポートすることはできません。ベクトルを使用した後にメモリリークを防ぐ良い解決策はありますか?ライブラリをインポートせずにベクターを削除する方法

+1

ベクトル> Xを使用することができます。あなたがベクトルを使って終わったら、x.clear(); – johnathon

+0

完了したら手動で削除するだけですか?あるいは、あなた自身の 'shared_ptr'クラスを書いてください。 – jli

+0

@ johnathon:答えとして投稿してみませんか? – Tibor

答えて

2

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を参照してください。

+0

私は 'void main'を使用しているという点を除いてリンクが気に入っています。 – chris

+0

ああ、それは痛い... – Tibor

3

コードスニペットでは、charポインタのベクトルを使用しています。私はそれらのポインタが新しいを介して割り当てられていると仮定し、それらは削除によって解放する必要があります。ベクトルが範囲外になると、そのベクトルは解放されますが、それらのchar配列はすべて解放されません。手動でそれらを解放する必要があります。

std::string、特にvector<std::string>を使用することもできます。このようにして、ベクトルが範囲外になると、すべての文字列が自動的に削除されます。

+0

もしOPがchar *を使って正確に文字列でないものを表現していたら... TCP接続からのパケット?ベクトルはその場合に最もよく使用されていますが、いずれの方法でも、ポインタの所有は悪いですが、スマートなポインタを使用する方が良い場合はそれが良いでしょう。 – johnathon

+0

TCPパケットを表すのにchar *が「ベスト」であるのはなぜですか?完全に状況に依存します。パッケージを表現するためのクラスを持つことができます。手動でメモリを管理する必要はありません。 – stijn

+0

私はもっと単純な仮定を使用しました。その場合、彼はベクトルをたどってすべてのメンバを 'delete [] 'するだけでよいのです。 'vector'はそれ自身の後でクリーンアップすることができますが、普通の古いポインタを使用している場合、ベクトルはそれらをクリーンアップしません。自分で削除する必要があります。 – Ove

0

あなたは

//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 
+0

もちろん、彼は可能ですが、なぜRAIIが提供するすべてのメリットがあるのでしょうか?これはそれを行うCの方法です。 – Tibor

+0

この例は、手動で実行する方法を理解することです。ソースの中で、生のポインタを使うべきではありません。たとえば 'shared_ptr >' ' – Seagull

関連する問題