我从下面的代码中收到无效点错误,我不明白为什么。我要做的就是从 vector 中删除堆上的一些字符串:
void func() {
vector<string>* vec = new vector<string>;
vec->push_back(*(new string("1")));
vec->push_back(*(new string("2")));
for(vector<string>::iterator itr = vec->begin(); itr != vec->end(); ++itr)
{
string* ptr = &(*itr);
delete(ptr);
}
}
编辑:是因为 push_back 创建了字符串的拷贝吗?
最佳答案
你的错误是因为元素不是动态分配的; vector 是。您要执行的操作需要:
void func()
{
vector<string*> vec;
vec.push_back(new string("1"));
vec.push_back(new string("2"));
for(vector<string*>::iterator itr = vec.begin(); itr != vec.end(); ++itr)
{
string* ptr = *itr;
delete(ptr);
}
}
但老实说,我看不出有什么理由这样做。正如您编写的代码不仅试图删除它从未实际分配的内存,它还会泄漏它分配的内容。
有理由将指向对象的指针存储在像这样的 vector 中(例如对象实际上来自其他地方的另一个容器,您需要一个临时列表来进行自定义排序操作而无需扰乱了原始内容),但有些东西告诉我,您离这种需求还有很长的路要走。
关于C++无效指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15031803/