当我调试别人的代码时,我怎么能找到删除指针的时候?
答案 0 :(得分:5)
1)
使用调试器。 按照一个删除。 一般来说,你最终会通过指针传递一些“自由”函数
设置一个断点,条件是过去的指针与调查指针的值相同
2)
一种类似的方法是覆盖“删除”方法并检查有问题的指针。
3)
如果指针引用带有析构函数的对象。在析构函数上放置一个断点。 也许你可能想先添加一个析构函数(如果可能的话,可以通过外部代码添加,总是可以在自己的代码上添加)
答案 1 :(得分:4)
在相关类型的析构函数上设置条件断点。让条件为this
指向您感兴趣的对象。例如,在Visual C ++ Express 2010中:
对于上图,我首先在三个new
表达式之后执行,然后记下b
对象的地址,然后用作this
应该是该地址的断点条件
如何使用其他调试器执行此操作的详细信息取决于调试器。请参阅调试器手册。
答案 2 :(得分:1)
在C ++中,您没有任何内置的跨平台功能,可以查找指针是否被删除。
但是,您可以使用某些调试器,工具和语言本身提供的功能。例如,您可以全局和/或基于每个类重载new
和delete
运算符,并维护一个公共集/映射类型的引用。 e.g:
class X {
...
set<void*> m_CurrentAlloc;
public:
void* operator new (size_t SIZE)
{
...
m_CurrentAlloc.insert(p);
return p;
}
void operator delete (void *p)
{
m_CurrentAlloc.erase(p);
...
}
};
在定期基础或程序结束时,可以打印或验证此set
的内容
请记住,这是一个理想情况的解决方案,您可以使用new/delete
进行内存管理。如果您混合了malloc/free
,那么代码也需要其他增强功能。
答案 3 :(得分:0)
GDB watchpoint怎么样?您可以在有问题的指针上设置观察点,并查看程序何时访问以删除其指示对象。
答案 4 :(得分:0)
如果您指的是指针指向的内存,则不能。但是,如果您遇到dangling指针的问题,只需用boost :: shared_ptr替换所有原始指针,并删除所有出现的free和delete。切勿使用删除或免费关键字。智能指针摇滚!
答案 5 :(得分:-1)
你做不到。使用智能指针,从不担心它。