智能指针支持用户自定义删除方法,默认为delete或者delete[],我们构造如下这种有问题的方式,智能指针接管对象后,会在引用计数值归0时调用delete,也就是A的析构函数。在这里我们把里边的free注释掉,运行之后可以看到有明显的内存泄漏情况。
#include<cstring>
#include<cstdlib>
#include<memory>
#include<string>
using namespace std;
struct A
{
int a,b;
int* p;
A()
{
p=(int*)malloc(sizeof(int)*100000);
}
~A()
{
//free(p);
}
};
int main ()
{
while(1)
{
A*p=new(A);
shared_ptr<A>sp(p);
_sleep(1);
}
}
这时我们可以提供一个可运行对象修改智能指针在析构的时候对所指对象执行的删除行为。
shared_ptr只需要把函数指针当作参数传递给它即可,此时再运行就不会有内存泄漏的情况出现了。
#include<cstring>
#include<cstdlib>
#include<memory>
#include<string>
using namespace std;
struct A
{
int a,b;
int* p;
A()
{
p=(int*)malloc(sizeof(int)*100000);
}
~A()
{
//free(p);
}
};
void deleter(A* pa)
{
free(pa->p);
}
int main ()
{
while(1)
{
A*p=new(A);
shared_ptr<A>sp(p,deleter);
_sleep(1);
}
}