思路
重载new/delete操作符,用静态数据结构记录被删除的指针,用类成员静态函数判断指针是否被删除。
实现代码
#include <set>
#include<stdlib.h>
static std::set<void *> deleted_p;//记录已经被释放的指针地址
class A
{
public:
A(int a)
{
}
void* operator new(std::size_t size)
{
void *o=malloc(size);
auto r=deleted_p.find(o);
if(r!=deleted_p.end())
{
deleted_p.erase(r);
}
return o;
}
void operator delete(void *o)
{
deleted_p.insert(o);
free(o);
}
static bool isDeleted(A* a)
{
auto r=deleted_p.find(a);
return r!=deleted_p.end();
}
};
class B:public A
{
public:
B(int a):A(a)
{
}
};
int main(int argc, char*argv[])
{
for(int i=0;i<1000;i++)
{
A* a=new B(i);
if(A::isDeleted(a))
{
int b=0;//不会进入
}
delete a;
if(A::isDeleted(a))
{
int b=0;//会进入
}
}
}
总结
感觉怪怪的效率应该很低