我想知道是否有可能在C ++中捕获这样的错误:
object* p = new object;
delete p;
delete p; // This would cause an error, can I catch this?
我知道在删除第一个对象后,我可以将指针p
设置为NULL
。但想象一下你不会这样做。
答案 0 :(得分:10)
我认为你不能捕捉到这种错误,因为我认为结果是未定义的行为。它可能什么都不做,它可能会崩溃,它可能只是破坏内存并在以后引起问题。
如果您发现它对您当前的编译器执行了特定的操作,您可以尝试处理它,但它可能在调试和发布中执行不同的操作,并在升级编译器版本时再次不同。
建议将指针设置为null,但我认为最好不要使用智能指针而不删除它们。
答案 1 :(得分:2)
为什么没有人想使用像boost::shared_ptr
这样的智能指针?如果您使用它,您可以忘记delete
- 运算符。 ;)
答案 2 :(得分:1)
不幸的是我不能代表windows世界,但我知道unix世界中有一些工具可以为你做这些(在运行时)
这个想法是实现内存分配功能和一些额外的检查。可以告诉库在发现问题时中止该过程,并且您可以通过查看堆栈跟踪找到问题。 关于solaris的libumem就是其中的一个例子。
我确信Windows平台上一定有类似的东西。
还有其他工具可以执行静态代码分析,这有助于您在运行代码之前找到问题。 Coverity就是一个例子,我认为它也适用于Windows。我们设法找到了很多隐蔽性的潜在问题。不幸的是,它不是免费的。评估版本应该是可能的。
答案 3 :(得分:1)
您可以使用任何内存调试程序(例如Windows上的BoundsChecker或Purify以及Linux上的Valgrind来捕获这些错误。