2009-09-03 577 views
4

我有一个回答中,我描述了捕获异常困难,当我试图访问已释放由第三方功能的对象previous question。该函数有时会执行并且有时不会释放该对象。如何确定C++对象是否已被释放?

为了避免使用一个try/catch块捕获SEH异常如前面所描述的问题,我需要能够告诉对象是否已释放或没有。

如何确定C++对象是否已被释放或仍然是有效的指针?

+6

如果第三方库不告诉你该对象是否被删除,是时候去另一个库了。 – 2009-09-03 16:23:13

回答

10

你不能简单的只是通过在存储器位置看,如果该对象是否仍然分配或不知道。可能有一些黑魔法技巧来做到这一点,但更清洁的方法是建立回拨机制到对象的析构函数。

+0

我不控制对象定义 - 它是从第三方DLL返回的对象。 – 2009-09-03 22:29:22

3

你不能。如果你使用的函数没有给你方法知道它是否释放了对象本身,那么你就无法找到它。

编辑:那么,除非所讨论的对象是自己的类的实例,您可以修改析构象阿德里安建议。

2

我不认为你可以,至少不会以标准的方式。据我所知,没有要求堆管理器能够检测以前是否返回过地址的情况。

如果有,就没有必要让它不确定什么delete是无效的指针做。

+1

我想你可以重写malloc并自由实现类似的功能,但这就是我所说的黑魔法...... – 2009-09-03 15:52:07

6

我想你问错了问题。这个问题真的应该是:

为什么我觉得我需要看一些地址,以确定指向那里的指针指向的是一个对象还是指向一个前对象之后留下的垃圾删除吗?

老实说,你不应该在这种情况下。如果一个对象被删除,为什么你留下一个指向其前地址的指针?理想情况下,指针应该超出范围。如果在你的代码是不可能的,它应该被设置为NULL

+2

我会修改你的语句......我不应该放在那个位置上。不幸的是,这是我被第三方代码放置的位置。有时它释放它,有时它不会。 – 2009-09-03 22:30:52

+1

Ouch。一个第三方库有时会把指针指向一个已经被删除的对象?你不能提交错误报告?而lib仍然值得使用?这听起来像是一个非常糟糕的情况。 – sbi 2009-09-04 10:13:58

+2

在编写程序的上下文中,这可能是一个错误的问题,但在编写测试单元的上下文中,如果要查明指针是否实际上应该被删除,这是一个正确的问题。 – tlonuk 2014-02-15 13:37:50

0

如果你控制访问你的对象的所有代码,那么正确的方法是使用boost :: shared_ptr来管理对象的生命周期,然后boost :: weak_ptr对于你期望在对象之后保留的任何引用被删除。

虽然看着关于第三方库的其他问题,但可能会被卡住。如果库是容易删除对象的其他选项的副作用,那么很有可能你不打算继续围绕这些指针。是否有理由在任何时候都不能重新提取对象,或者至少在做过任何可能已经删除对象的事情之后?

0

创建于desrtruction通知析构函数。它甚至可以切换一个布尔,如果你想在运行时检查它。

class free 
{ 

public: 

    ~free() { cout << "Im being freed " << endl; } //destructor output 
}; 

这将在控制台输出它被释放。在被释放后,任何对它的引用都将是未定义的行为,即使它看起来存在。