如何检查指针何时被删除?

时间:2012-05-26 11:21:20

标签: c++ pointers delete-operator

当我调试别人的代码时,我怎么能找到删除指针的时候?

6 个答案:

答案 0 :(得分:5)

1)

使用调试器。 按照一个删除。 一般来说,你最终会通过指针传递一些“自由”函数

设置一个断点,条件是过去的指针与调查指针的值相同

2)

一种类似的方法是覆盖“删除”方法并检查有问题的指针。

3)

如果指针引用带有析构函数的对象。在析构函数上放置一个断点。 也许你可能想先添加一个析构函数(如果可能的话,可以通过外部代码添加,总是可以在自己的代码上添加)

答案 1 :(得分:4)

在相关类型的析构函数上设置条件断点。让条件为this指向您感兴趣的对象。例如,在Visual C ++ Express 2010中:

enter image description here

对于上图,我首先在三个new表达式之后执行,然后记下b对象的地址,然后用作this应该是该地址的断点条件

如何使用其他调试器执行此操作的详细信息取决于调试器。请参阅调试器手册。

答案 2 :(得分:1)

在C ++中,您没有任何内置的跨平台功能,可以查找指针是否被删除。

但是,您可以使用某些调试器,工具和语言本身提供的功能。例如,您可以全局和/或基于每个类重载newdelete运算符,并维护一个公共集/映射类型的引用。 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)

你做不到。使用智能指针,从不担心它。