【发布时间】:2014-02-21 17:47:05
【问题描述】:
当我尝试删除对象的动态向量的动态内存元素时,我必须多次迭代向量的整个大小以确保完全解除分配。
class CV{
public:
float x;
float y;
CV();
CV(float, float);
~CV();
};
int main(){
vector<CV*>* cars;
cars = new vector<CV*>;
//create objects with new, push into vetor
for(int j=0;j<4;j++){
cars->push_back( new CV(10.0+j, 11.99+j) );
}
while( cars->size() > 0 ){
for(int i=0;i<cars->size();i++){
delete (*cars)[i];
cars->erase( cars->begin()+i);
}
cout << "size:"<< cars->size() << endl;
}
delete cars;
return 0;
}
这将输出:
size:2
size:1
size:0
当我尝试删除时,向量似乎每隔一个元素就迭代一次,因为我需要额外的 while 循环来确保完全释放。
我似乎遗漏了有关向量内部工作的一些信息,我尝试阅读向量 c++ 参考,并且我了解向量将元素存储在一个连续的位置,并且它们为可能的增长分配了额外的存储空间,但我未能理解这段代码的行为。
【问题讨论】:
-
cars = new vector<CV*>;这是个坏主意,为什么不直接vector<CV*> cars;?你持有原始指针项目已经使一切变得足够复杂...... -
你注意到有
std::erase()函数顺便说一句。 -
@πάνταῥεῖ 没有
std::erase功能。你的意思是std::vector::erase还是std::remove? -
@FrançoisMoisan 当然是后者,谢谢!
-
与其从向量中一次删除一个元素(强制重新定位所有后续元素),为什么不只是
delete所有元素然后在向量上调用clear()?