2

私はvector文字列を持っていますが、これらの文字列は文字の配列を割り当てることによって作成されます。この配列は、。を使用してヒープ内に動的に作成されますnew。ヒープに割り当てたメモリを解放することをお勧めしますが、このメモリを解放する方法がわかりませんvector

私がこのようなことをしようとすると:

for(i = 0; i < myVector.size(); i++)
     delete myVector[i];

それは私にこのエラーを与えます:

式はポインタ型である必要があります

これが私がベクトルを宣言する方法です

vector<string> myVector;
char* s1 = new char[2];
s1[0] = 'a';
s1[1] = '\0';
myVector.push_back(s1);
char* s2 = new char[2];
s2[0] = 'b';
s2[1] = '\0';
myVector.push_back(s2);
//etc..

この場合はどうすればよいですか?

4

2 に答える 2

5

およびを使用するvector<string>ため、std::stringオブジェクトは独自のメモリを管理するためdelete、ベクトルの要素を使用する必要はありません。文字列は、作成時に渡されたコンテンツをコピーします。

ただし、で割り当てたC文字列を削除する必要がありますnew[]。オブジェクトを作成した直後に行う必要がありますstring。文字列が作成されると、文字データを安全に削除できます。

char s1 = new char[2];
s1[0] = 'a';
s1[1] = '\0';
myVector.push_back(s1);
delete[] s1;  // Here

文字列を作成するためのかなり回りくどい方法を選択したことに注意してください。次のように呼び出すことで、まったく同じことを実行できます。

myVector.push_back("a");
于 2013-03-07T00:00:05.653 に答える
1

別の可能性はstd::string、すなわちの使用ですstd::vector<std::string>

その場合、ポインタを保持しない限り、初期メモリを削除することはできません(std::stringとにかく、は独自の文字列コピーを保持するため、これは無意味です)。


std::string投稿されたコードを考慮すると、暗黙的な型変換を使用しているためにコンストラクターが表示されない場合でも、コンストラクターに渡した文字列の独自のコピーが作成されることに注意してください。

ベクトル内に文字列を配置した直後に、メモリを解放(delete)します。文字列はこれによる影響を受けません。

于 2013-03-07T00:00:27.927 に答える