2011-04-21 69 views
3

我是一名软件实习生,在C++中使用大型项目​​,&我也是一个团队。令人畏惧(这是你如何拼写:P),是的,但也很有趣。我不知道,但我怀疑它,因为我指向的对象被更新,因此最初分配指针不指向正确的内存地址。查找指针何时超出范围的程序和技巧

正如你可以看到我很困惑自己,这就是为什么我想知道的技术或免费程序这帮助我确定何时& WHERE指针指向空或超出范围(悬挂指针?是最新发生的)

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

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

+1

我认为你需要做得比这更好。如果它们变成'NULL',那是因为有些东西将它们设置为'NULL'。我没有看到任何没有看到你的代码的人可以说如何。哦,并且无论如何,如果您需要澄清发生的事情,请将'ASSERT'放在所有位置。而且,当你在使用调试器的时候,它也会变得更好。 – 2011-04-21 03:33:54

+0

您提到使用Eclipse;你在Windows上,你有/可以使用Visual Studio吗?VS2010和2008的某些版本附带内置的分析功能,可以提供一些帮助。您也可以下载WDK并从中使用PREfast。 – ssube 2011-04-21 03:34:53

+0

更新一个对象不会*使指向它的指针无效。 – fredoverflow 2011-04-21 07:52:27

回答

5

我建议两种不同的工具:

  • Cppcheck是一个静态分析工具,看你的源代码,并试图发现问题(与指针,并与很多其他事情也是如此)。

  • Valgrind是一个运行时工具,它监视程序执行的所有分配和释放,并确保它们都是正确的。

+0

@Greg Hewgill感谢您的回复。我以前看过Valgrind,是程序运行时运行的图形用户界面还是c库?我在自己的代码中放置了valgrind c函数来检查指针? – Mack 2011-04-21 03:35:08

+0

Valgrind既不是 - 而是以'。/ myprogram'或其他方式运行你的程序,你运行'valgrind ./myprogram',输出被写入控制台。它的操作几乎完全是自动的,你根本不需要修改你的代码。 – 2011-04-21 03:38:54

+0

@伊巴克斯特:这是一个严重的错误表述。我会留下来的。 – 2011-04-21 03:55:38

1

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

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 */ 
}; 
1

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

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