我试图std::vector通过使用以下代码删除所有内容
vector.erase( vector.begin(), vector.end() );
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
更新:不清除破坏向量所持有的元素吗?我不想那样,因为我还在使用这些对象,我只是想清空容器
Ara*_*raK 103
我认为你应该使用std::vector::clear:
vec.clear();
Run Code Online (Sandbox Code Playgroud)
编辑:
不清除破坏向量所持有的元素吗?
是的,它确实.它在返回内存之前调用向量中每个元素的析构函数.这取决于您在矢量中存储的"元素".在下面的示例中,我将它们自己存储在向量中:
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).
Run Code Online (Sandbox Code Playgroud)
例如,如果要在不同容器之间共享对象,则可以存储指向它们的指针.在这种情况下,当clear调用时,只释放指针内存,不触及实际对象:
std::vector<myclass*> myvector;
...
myvector.clear(); // calling clear will do:
// 1) ---------------
// 2) size == 0 (the vector contained "pointers" not the actual objects).
Run Code Online (Sandbox Code Playgroud)
对于评论中的问题,我认为getVector()定义如下:
std::vector<myclass> getVector();
Run Code Online (Sandbox Code Playgroud)
也许你想要返回一个参考:
// vector.getVector().clear() clears m_vector in this case
std::vector<myclass>& getVector();
Run Code Online (Sandbox Code Playgroud)
aJ.*_*aJ. 33
vector.clear()应该适合你.如果你想缩小的能力,vector那么就明确了
std::vector<T>(v).swap(v);
Run Code Online (Sandbox Code Playgroud)
Dev*_*lar 10
vector.clear()实际上与vector.erase(vector.begin(),vector.end())相同.
如果您的问题是关于调用向量中包含的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 );
Run Code Online (Sandbox Code Playgroud)
标准免责声明:用浏览器编写的代码,未经测试.
使用v.clear()清空向量.
如果向量包含指针,则clear调用对象的析构函数,但不删除指针引用的内存.
vector<SomeClass*> v(0);
v.push_back( new SomeClass("one") );
v.clear(); //Memory leak where "one" instance of SomeClass is lost
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
118836 次 |
| 最近记录: |