节目&用于查找指针何时超出范围的技术

时间:2011-04-21 03:25:38

标签: c++ pointers memory-leaks

我是一名从事C ++大型项目的软件实习生,&我也是一个单人团队。令人生畏(这就是你如何拼写它:P),是的,但也很有趣。

我遇到的c ++指针最终指向NULL(不是因为内存被释放/删除,但是因为,我真的不知道,但我怀疑它因为我指向的对象被更新,因此最初分配指针未指向正确的内存地址。

正如您所看到的,我感到很困惑,这就是为什么我想知道技术或免费程序,它们可以帮助我确定WHEN&何时指针指向null或超出范围(悬挂指针?是发生了什么)。

也许我可以使用简单的ASSERT调用来确定指针何时为空?

更多信息:现在我的问题是我有一个具有成员变量指针的类。它们在构造函数&中初始化。在构造函数的末尾,那些指针指向正确的对象。但是在对事件的反应中,当我看到这些指针时,它们是空的/超出范围。我可以确定这个因为1.程序崩溃& 2 eclipse调试器将它们显示为红色空心圆(我认为这意味着指向NULL或超出范围?)。

4 个答案:

答案 0 :(得分:5)

我建议使用两种不同的工具:

  • Cppcheck是一个静态分析器,它会查看您的源代码并尝试识别问题(使用指针,以及许多其他内容)。

  • Valgrind是一个运行时工具,可以监视程序执行的所有分配和解除分配,并确保它们都正确无误。

答案 1 :(得分:1)

如果被指向的对象是自定义类,则可以在析构函数中放置一个断点,以查看它是否/何时被销毁。如果没有,您可以为该类的析构函数设置符号断点。

答案 2 :(得分:1)

您需要一个数据断点。 Visual Studio肯定有它们。 GDB肯定有它们 - 它可能称之为别的东西(观察点?)。我没有使用Eclipse,但也可能会这样做。

因此,您在构造函数中设置(常规)断点,以便正确设置指针。然后选择其中一个指针,并在其上放置一个数据断点。然后跑。当某些东西改变指针的值时,程序将停止。那会告诉你问题所在。

答案 3 :(得分:0)

使数据(指针)保密,并通过断言强制使用特定用法。例如:

class t_class {
public:
    /* ... */
    void invalidatePointer() {
    /* is a delete required??? */
        this->d_pointer = 0;
    }

    void setPointer(int* const p) {
        assert(p && "use invalidatePoiner");
        /* ...stuff... */
        this->d_pointer = p;
    }
private:
    int* d_pointer; /* you probably don't want a non-contained pointer here, either */
};