【问题标题】:Can I catch bad pointer errors in C++?我可以在 C++ 中捕获错误的指针错误吗?
【发布时间】:2010-06-18 07:36:34
【问题描述】:

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

object* p = new object;

delete p;
delete p; // This would cause an error, can I catch this?
  1. 能否检查指针是否有效?
  2. 我能捕捉到一些异常吗?

我知道我可以在第一次删除对象后将指针 p 设置为 NULL。但想象一下你不会那样做。

【问题讨论】:

  • 问题不在于如何从此类错误中恢复,问题在于如何不首先制造它们。 (设置指向NULL 的指针也是如此。为什么作用域中的指针不指向某物?)C++ 带有许多阻止您手动管理指针(和其他资源)的结构。在做 C++ 的最后十年里,我很少需要手动 delete 任何东西。
  • @Job 你是对的 - 应该提取参考。

标签: c++ pointers memory-management


【解决方案1】:

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

如果您发现它对您当前的编译器做了一些特定的事情,您可以尝试处理它,但它可能会在调试和发布时做不同的事情,并且在您升级编译器版本时再次不同。

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

【讨论】:

    【解决方案2】:

    为什么没有人愿意使用像boost::shared_ptr 这样的智能指针?如果你使用它,你可以忘记delete-operator。 ;)

    【讨论】:

      【解决方案3】:

      很遗憾,我不能代表 windows 世界,但我知道 unix 世界中有一些工具可以为您做到这一点(在运行时)

      这个想法是实现内存分配功能和一些额外的检查。当发现问题时,可以告诉库中止进程,您可以通过查看堆栈跟踪找到问题。 solaris 上的libumem 就是一个例子。

      我相信windows平台上一定有类似的东西。

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

      【讨论】:

      • 另一个有用的(非免费)工具是 Purify。它是一个运行时内存访问检查器,它工作得非常好,可以发现各种潜在的问题。如果你在 Linux 上,还有 valgrind 和 efence。
      【解决方案4】:

      您可以使用任何内存调试器捕获这些错误,例如 Windows 上的 BoundsCheckerPurify 以及 Linux 上的 Valgrind

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 2012-01-11
        • 2016-02-26
        • 2019-08-25
        • 2015-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多