placement new 的问题

来源:互联网 发布:自动画线源码 编辑:程序博客网 时间:2024/04/29 02:03

内存池会用到这种技巧,但是还是有内存泄露的风险:

#include <iostream>#include <map>#include <malloc.h>#include <vector>using namespace std;class User{public:~User(){}int m1;map<int, int> m2;vector<int> m3;};int a = 1;void printInfo(){printf("%d\n", a++);malloc_stats();printf("\n");}int main(){//printInfo();char* pMem = new char[100];printInfo();User* pUser = new (pMem)(User);printInfo();for (int i = 0; i < 1000; ++i){pUser->m2[i] = i;pUser->m3.push_back(i);}pUser->m2.clear();pUser->m3.clear();//pUser->~User();printInfo();delete[]  pMem;printInfo();return 0;}

这里还是有问题,来看真相:


因为vector的内存还是在STL的内存池里没有释放,造成了暂时的内存泄露,因此要显式调用它的析构:

然后结果是:


可以看到这次没有内存泄露了。

所以内存泄露神马时候都要小心翼翼。

0 0