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)
}