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的任何操作都将导致未知的结果