次のコードを使用して、std::vector
からすべてを削除しようとしています
vector.erase( vector.begin(), vector.end() );
しかし、それは機能しません。
更新:ベクターが保持している要素を消去しませんか?私はまだオブジェクトを使用しているので、それを望んでいません、ただコンテナを空にしたいだけです
_std::vector::clear
_ を使用する必要があると思います:
_vec.clear();
_
編集:
ベクターによって保持されている要素を破壊しませんか?
はい、そうです。メモリを返す前に、ベクター内のすべての要素のデストラクタを呼び出します。それは、ベクターに保存する「要素」に依存します。次の例では、ベクター自体にオブジェクトを保存しています。
_class myclass
{
public:
~myclass()
{
}
...
};
std::vector<myclass> myvector;
...
myvector.clear(); // calling clear will do the following:
// 1) invoke the deconstrutor for every myclass
// 2) size == 0 (the vector contained the actual objects).
_
たとえば、異なるコンテナ間でオブジェクトを共有する場合、それらへのポインタを保存できます。この場合、clear
が呼び出されると、ポインターメモリのみが解放され、実際のオブジェクトは変更されません。
_std::vector<myclass*> myvector;
...
myvector.clear(); // calling clear will do:
// 1) ---------------
// 2) size == 0 (the vector contained "pointers" not the actual objects).
_
コメント内の質問について、getVector()
は次のように定義されていると思います。
_std::vector<myclass> getVector();
_
たぶん、あなたはリファレンスを返したいでしょう:
_// vector.getVector().clear() clears m_vector in this case
std::vector<myclass>& getVector();
_
vector.clear()
はあなたのために動作するはずです。 clearとともにvector
の容量を縮小する場合
std::vector<T>(v).swap(v);
vector.clear()は、事実上vector.erase(vector.begin()、vector.end())と同じです。
あなたの問題が、ベクトルに含まれるそれぞれのpointerに対してdelete
を呼び出すことである場合、これを試してください:
#include <algorithm>
template< typename T >
struct delete_pointer_element
{
void operator()( T element ) const
{
delete element;
}
};
// ...
std::for_each( vector.begin(), vector.end(), delete_pointer_element );
標準免責事項:ブラウザで記述されたコード、テストなし。
v.clear() を使用して、ベクターを空にします。
ベクトルにポインターが含まれる場合、clearはオブジェクトのデストラクターを呼び出しますが、ポインターが参照するメモリは削除しません。
vector<SomeClass*> v(0);
v.Push_back( new SomeClass("one") );
v.clear(); //Memory leak where "one" instance of SomeClass is lost
v.clear()
は何らかの理由で機能していませんか?
ポインターをコンテナー内に保持し、それらを手動で破棄することに煩わされたくない場合は、 boost shared_ptr を使用します。 std :: vectorのサンプルを次に示しますが、他のSTLコンテナ(セット、マップ、キューなど)に使用できます。
#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>
struct foo
{
foo( const int i_x ) : d_x( i_x )
{
std::cout << "foo::foo " << d_x << std::endl;
}
~foo()
{
std::cout << "foo::~foo " << d_x << std::endl;
}
int d_x;
};
typedef boost::shared_ptr< foo > smart_foo_t;
int main()
{
std::vector< smart_foo_t > foos;
for ( int i = 0; i < 10; ++i )
{
smart_foo_t f( new foo( i ) );
foos.Push_back( f );
}
foos.clear();
return 0;
}
swap().
の上記の利点に加えて、clear()
はメモリの割り当て解除を保証しません。次のようにswap()
を使用できます。
std::vector<T>().swap(myvector);