2011-05-19 83 views
2

是否有工具可以捕获堆栈对象的删除,gcc和Visual Studio调试版本可能会立即在该事件中中断?捕捉堆栈对象的删除?

我处理大的旧项目,所以这不是如何编写代码的问题,而是如何检测和修复问题。

+0

你的意思是在基于堆栈的对象上显式调用'delete'的意义? – 2011-05-19 12:55:12

+1

您是否尝试过在堆栈对象的类的析构函数中放置一个断点,或者在堆栈对象即将清理之前的方法末尾? – 2011-05-19 12:56:10

+1

如果该类的所有对象始终位于堆栈上,则可以给它一个私有的,未实现的'operator delete'。 – 2011-05-19 12:58:23

回答

2

大多数堆实现不允许指向无效指针(即,当您的delete地址未由堆返回给您时)。几乎可以肯定的是标准窗口堆和CRT的堆(由MSVC实现)在这种情况下会产生调试断点。

你也可以替换new/delete运算符的实现并自己检查(在你的情况下你只想检查地址是否属于堆栈内存,这很容易)。

2

如果您事先设计所有权并在必要时使用智能指针来强制执行,那么这种情况就不太可能发生。我怀疑他们会做任何事情,但抛出一个通用的坏释放。

+0

我主要关心它不会抛出的可能性,以缩小寻找问题的幽灵。 – Vasaka 2011-05-19 13:12:48

+0

@q______b:它会立即抛出。它可能不会抛出并告诉你这是问题的具体原因,但它几乎肯定会抛出。 – Puppy 2011-05-19 13:23:01