C++ 删除指针映射:free() 大小无效
C++ delete map of pointers: free() invalid size
我正在尝试删除地图中的指针,但在 delete
部分出现错误:
std::map<uint, std::vector<double>*> m;
std::map<uint, std::vector<double>*>::iterator it;
for(it = m.begin(); it != m.end(); ++it) {
delete it->second;
}
* Error in ...: free(): invalid size: 0x000000000a06ca30 *
地图中的矢量肯定存在并且包含一些值。我显然遗漏了什么?
编辑:这是我插入或更新向量的方式:
std::vector<double>* v = new std::vector<double>;
// add something to v
std::pair<std::map<uint, std::vector<double>*>::iterator, bool> ret = m.insert(std::pair<uint, std::vector<double>*>(i, v));
if(ret.second == false) {
delete ret.first->second;
ret.first->second = v;
}
提前致谢。
您在这里删除的不是 map
,而是 vector
。地图是一个容器。你不能删除它。相反,您可以删除地图中的对象。如果只想移除地图中的对象,可以使用map::erase
.
你大概可以通过这些answers
你是:
- 试图释放一个不是由 malloc 分配的指针
- 或删除不是由 new 创建的对象
- 或多次free/delete反对
你的代码没问题,你可以在这里测试:http://coliru.stacked-crooked.com/a/ef44f698821c9851
但您可能在中间做了一些其他事情,很可能会双重删除这些指针 - 是什么导致了此类运行时错误。
[OP 编辑后]
在看到您编辑过的问题后,我可以说您很可能会为各种地图键重用相同的指针。解决方案是将删除的指针设置为 nullptr,如下例所示:
std::map<uint, std::vector<double>*>::iterator it;
for(it = m.begin(); it != m.end(); ++it) {
auto ptr = it->second;
for(it = m.begin(); it != m.end(); ++it) {
if ( it->second == ptr )
it->second = nullptr;
}
delete ptr;
}
我建议您对向量的内容使用 boost::shared_ptr(或类似的)(boost::shared_ptr)。然后你不需要删除内容,你可以只删除矢量元素,shared_ptr 会为你释放内存,而不需要使用 delete()。
typedef boost::shared_ptr<double> doublePtr;
std::map<uint, std::vector<doublePtr>> m;
std::map<uint, std::vector<doublePtr>>::iterator it;
for(it = m.begin(); it != m.end(); ++it) {
m.erase (it); // Erase the map element (i.e. the vector), this destroys the vector and all shared_ptrs then free their memory as no more references exist to them (in this sample)
}
我正在尝试删除地图中的指针,但在 delete
部分出现错误:
std::map<uint, std::vector<double>*> m;
std::map<uint, std::vector<double>*>::iterator it;
for(it = m.begin(); it != m.end(); ++it) {
delete it->second;
}
* Error in ...: free(): invalid size: 0x000000000a06ca30 *
地图中的矢量肯定存在并且包含一些值。我显然遗漏了什么?
编辑:这是我插入或更新向量的方式:
std::vector<double>* v = new std::vector<double>;
// add something to v
std::pair<std::map<uint, std::vector<double>*>::iterator, bool> ret = m.insert(std::pair<uint, std::vector<double>*>(i, v));
if(ret.second == false) {
delete ret.first->second;
ret.first->second = v;
}
提前致谢。
您在这里删除的不是 map
,而是 vector
。地图是一个容器。你不能删除它。相反,您可以删除地图中的对象。如果只想移除地图中的对象,可以使用map::erase
.
你大概可以通过这些answers
你是:
- 试图释放一个不是由 malloc 分配的指针
- 或删除不是由 new 创建的对象
- 或多次free/delete反对
你的代码没问题,你可以在这里测试:http://coliru.stacked-crooked.com/a/ef44f698821c9851
但您可能在中间做了一些其他事情,很可能会双重删除这些指针 - 是什么导致了此类运行时错误。
[OP 编辑后]
在看到您编辑过的问题后,我可以说您很可能会为各种地图键重用相同的指针。解决方案是将删除的指针设置为 nullptr,如下例所示:
std::map<uint, std::vector<double>*>::iterator it;
for(it = m.begin(); it != m.end(); ++it) {
auto ptr = it->second;
for(it = m.begin(); it != m.end(); ++it) {
if ( it->second == ptr )
it->second = nullptr;
}
delete ptr;
}
我建议您对向量的内容使用 boost::shared_ptr(或类似的)(boost::shared_ptr)。然后你不需要删除内容,你可以只删除矢量元素,shared_ptr 会为你释放内存,而不需要使用 delete()。
typedef boost::shared_ptr<double> doublePtr;
std::map<uint, std::vector<doublePtr>> m;
std::map<uint, std::vector<doublePtr>>::iterator it;
for(it = m.begin(); it != m.end(); ++it) {
m.erase (it); // Erase the map element (i.e. the vector), this destroys the vector and all shared_ptrs then free their memory as no more references exist to them (in this sample)
}