C++容器存放指针时的资源释放问题

先说结论: 当容器中存放了指针时,clear()不能释放指针所占用的资源,每个指针都需要手动释放。


今天写代码时遇到了内存泄露的问题,经过排查发现是map和list中存放的指针没有释放,对map和list使用clear()后内存占用只下降了一点,经过查询之后发现指针所指的内存并没有释放,在这里记录一下。

数据结构:

std::map<std::string, IDBModel*> ,IDModel为自定义数据结构,这里不再赘述。

释放内存:

void DeletMapPtr(std::map<std::string, IDBModel*>& modelMap)
    for (auto iter = modelMap.begin(); iter != modelMap.end(); ++iter)
        if (iter->second != nullptr)
            delete iter->second;// 释放内存
            iter->second = nullptr;// 指针置空
    modelMap.clear();// 清空map

此时map所持有的所有资源已全部释放。

提示:

如果map中的指针被复制到其他容器中,map释放资源后,其他容器中被复制的指针已经是 野指针 了, 绝对不能再使用 ,应该及时删除或清空!

例如下面这个例子:

std::map<std::string, IDBModel*> modelMap;// 假设此时map中已经有了数据
std::list<IDBModel*> modelList;
void SetModelList()// 使modelList持有一份IDBModel*
    for (auto iter = modelMap.begin(); iter != modelMap.end(); ++iter)
        modelList.emplace_back(iter->second);
void DeletMapPtr(std::map<std::string, IDBModel*>& modelMap);
int main()
    SetModelList();
    DeletMapPtr(modelMap);// 释放map占用的资源
    for(auto iter : modelList)// 错误!modelList内的指针全为野指针
    {                         // 此时对iter的任何操作都将导致未知的结果