C++中删除元素后vector大小未改变?求解正确删除方法
问题分析与解决方案
嘿,我来帮你捋清楚这个问题~你遇到的核心问题很明确:你只是释放了指针指向的堆内存,但并没有把这些指针元素从vector容器中移除,所以容器的size()自然不会改变。
你的代码问题拆解
先看你这段代码的问题点:
cout << myVector.size(); // myVector.size() = 10 if(myVector.size() > 0){ for (vector<VectorClass*>::iterator it = myVector.begin() ; it != myVector.end(); ++it){ *it = 0; delete[] *it; } } cout << myVector.size(); // 还是10
*it = 0;这一步把迭代器指向的指针置空了,之后delete[] *it;其实是在删除一个空指针——这步不仅多余,而且如果你的VectorClass*是单个对象(用new VectorClass()分配的),用delete[]会触发未定义行为,应该用delete而不是delete[]。- 最关键的:你只处理了指针指向的内存,却没有修改
vector容器本身——容器里依然保留着10个指针(现在都是空指针了),所以size()输出还是10。
正确的两种处理方式
方式1:先释放内存,再清空容器
如果你的目标是彻底清理容器,先遍历释放每个指针指向的对象,再调用vector::clear()清空容器内的所有元素:
cout << myVector.size(); // 输出10 if(!myVector.empty()){ // 遍历释放每个指针指向的对象 for (auto it = myVector.begin(); it != myVector.end(); ++it){ delete *it; // 单个对象用delete,数组才用delete[] *it = nullptr; // 可选,避免野指针 } myVector.clear(); // 清空容器,size变为0 } cout << myVector.size(); // 输出0
方式2:边释放内存边删除容器元素
如果你需要逐个移除容器内的元素(比如特定条件下删除),可以用vector::erase(),但要注意erase会使当前迭代器失效,所以需要用erase返回的新迭代器继续遍历:
cout << myVector.size(); // 输出10 auto it = myVector.begin(); while(it != myVector.end()){ delete *it; // 先释放内存 it = myVector.erase(it); // 删除容器内的该元素,返回下一个有效迭代器 } cout << myVector.size(); // 输出0
额外提醒
一定要注意delete和delete[]的匹配:
- 如果指针是通过
new VectorClass()分配的单个对象,用delete - 如果是通过
new VectorClass[N]()分配的数组,才用delete[]
内容的提问来源于stack exchange,提问作者Sian
相关产品推荐
相关产品推荐

