我可以在C ++中捕获错误的指针错误吗?

时间:2010-06-18 07:36:34

标签: c++ pointers memory-management

我想知道是否有可能在C ++中捕获这样的错误:

object* p = new object;

delete p;
delete p; // This would cause an error, can I catch this?
  1. 我可以检查指针是否有效吗?
  2. 我能抓到一些例外吗?
  3. 我知道在删除第一个对象后,我可以将指针p设置为NULL。但想象一下你不会这样做。

4 个答案:

答案 0 :(得分:10)

我认为你不能捕捉到这种错误,因为我认为结果是未定义的行为。它可能什么都不做,它可能会崩溃,它可能只是破坏内存并在以后引起问题。

如果您发现它对您当前的编译器执行了特定的操作,您可以尝试处理它,但它可能在调试和发布中执行不同的操作,并在升级编译器版本时再次不同。

建议将指针设置为null,但我认为最好不要使用智能指针而不删除它们。

答案 1 :(得分:2)

为什么没有人想使用像boost::shared_ptr这样的智能指针?如果您使用它,您可以忘记delete - 运算符。 ;)

答案 2 :(得分:1)

不幸的是我不能代表windows世界,但我知道unix世界中有一些工具可以为你做这些(在运行时)

这个想法是实现内存分配功能和一些额外的检查。可以告诉库在发现问题时中止该过程,并且您可以通过查看堆栈跟踪找到问题。 关于so​​laris的libumem就是其中的一个例子。

我确信Windows平台上一定有类似的东西。

还有其他工具可以执行静态代码分析,这有助于您在运行代码之前找到问题。 Coverity就是一个例子,我认为它也适用于Windows。我们设法找到了很多隐蔽性的潜在问题。不幸的是,它不是免费的。评估版本应该是可能的。

答案 3 :(得分:1)

您可以使用任何内存调试程序(例如Windows上的BoundsCheckerPurify以及Linux上的Valgrind来捕获这些错误。