C++ 中 map 容器的内存释放机制及内存碎片管理
C++ 中的容器很好用,比如 vector, map 等,可以动态扩容,自己管理内存,不用用户关心,但是在某些极端情况下,如果内存比较紧张的情况下,可能用户对于这些容器自己的管理规则(主要是释放规则)就不太满意了。
1. erase, clean
通常在使用 map 的时候直接通过 erase,或者 clean 方法就可以删除数据,如果结合智能指针,用户不用关心内存的问题。但是需要注意的是,调用 erase 或者 clean 方法后,内存并没有立马释放,你仅能认为在某个时刻会自动释放。
下面的代码模拟了这一现象。第一个循环创建了一个 map,第二个循环清理数据。
#include <opencv2/opencv.hpp>
#include <map>
using namespace cv;
using namespace std;
int main(void)
{
map<int, shared_ptr<Mat>> m;
for (int i = 0; i < 1000; ++i)
{
const char* imagename = "D:\\Code\\test\\image\\t\\bb.png";
Mat img = imread(imagename);
shared_ptr<Mat> p = make_shared<Mat>(img);
m.insert(pair<int, shared_ptr<Mat>>(i, p));
}
for