我已经回答了previous question,其中我描述了在尝试访问已被第三方函数释放的对象时遇到异常的困难。该函数有时会执行并且有时不会释放该对象。
为了避免必须使用try / catch块来捕获上一个问题中描述的SEH异常,我需要能够判断对象是否已被释放。
如何确定C ++对象是否已被解除分配或仍然是有效指针?
答案 0 :(得分:11)
如果仍然分配了对象,则无法通过查看内存位置来轻松判断。可能会有一些黑魔法技巧,但更清洁的方法是在对象的析构函数中构建一个回调机制。
答案 1 :(得分:6)
我认为你问的是错误的问题。问题应该是:
为什么我觉得我需要查看一些地址才能找出指向那里的指针是指一个对象还是删除前一个对象后留下的垃圾?
老实说,你不应该处于那种境地。如果删除了一个对象,为什么还有一个指向其前地址的指针?理想情况下,指针应该超出范围。如果您的代码中无法执行此操作,则应将其设置为NULL
。
答案 2 :(得分:3)
你做不到。如果你正在使用的函数没有给你如何知道它是否释放了对象本身,你就无法找到它。
编辑:好吧,除非有问题的对象是你自己的类的一个实例,你可以修改像Adrian建议的析构函数。
答案 3 :(得分:2)
我认为你不能,至少不是以标准的方式。据我所知,没有要求堆管理器能够检测先前是否已返回地址。
如果有的话,就没有必要对delete
无效指针做什么进行定义。
答案 4 :(得分:0)
如果你控制访问你的对象的所有代码,那么正确的方法是使用boost :: shared_ptr来管理对象的生命周期,然后使用boost :: weak_ptr来查找你希望在对象之后保留的任何引用。删除。
看看你关于第三方图书馆的其他问题,你可能会陷入困境。如果库容易将对象删除作为其他选项的副作用,那么很可能您并不打算保留这些指针。是否有理由不能在任何需要的时候重新获取对象,或者至少在做了可能删除它的任何事情之后?
答案 5 :(得分:0)
创建一个析构函数,通知desrtruction。如果你想在运行时检查它,它甚至可以切换bool。
class free
{
public:
~free() { cout << "Im being freed " << endl; } //destructor output
};
这将在控制台中输出以释放它。被释放后,对它的任何引用都将是未定义的行为,即使它似乎存在。