首页 > 后端开发 > C++ > 正文

析构函数中的指针应该设置为 NULL 吗?看看最佳实践和调试。

Patricia Arquette
发布: 2024-10-28 06:30:30
原创
971 人浏览过

 Should Pointers Be Set to NULL in Destructors? A Look at Best Practices and Debugging.

在析构函数中将指针设置为 NULL

在面向对象编程中,动态分配内存并使用析构函数释放内存是很常见的。考虑以下为 Bar 类型的对象分配内存的类:

<code class="cpp">class Foo
{
public:
  Foo() : bar(new Bar)
  {
  }

  ~Foo()
  {
    delete bar;
  }

  void doSomething()
  {
    bar->doSomething();
  }

private:
  Bar* bar;
};</code>
登录后复制

问题出现了:在析构函数中将 bar 指针设置为 NULL 有好处吗?

反对设置为 NULL 的争论

与流行的看法相反,建议在析构函数中将指针设置为 NULL。虽然出于调试目的这似乎是个好主意,但它可能会导致发布版本中隐藏的问题。

如果指针设置为 NULL,则某个地方可能存在对已删除对象的悬空引用。在调试版本中,将检测到此引用并触发可诊断的崩溃。然而,在发布版本中,有缺陷的代码可能会避免使用指针,因为它注意到它是 NULL,从而掩盖了潜在的问题。

替代方法

而不是将指针设置为 NULL,更好的做法是将其设置为已知的错误指针值。这样,对已删除对象的任何悬空引用仍将尝试使用指针,从而触发更容易诊断和修复的崩溃。

例如,可以使用以下习惯用法:

<code class="cpp">~Foo()
{
    delete bar;
    if (DEBUG) bar = (bar_type*)(long_ptr)(0xDEADBEEF);
}</code>
登录后复制

这种方法允许在调试版本中捕获潜在的错误,同时仍然确保发布版本检测到悬空引用并导致崩溃。

结论

虽然它在析构函数中将指针设置为 NULL 似乎是个好主意,这样做可以隐藏发布版本中的潜在问题。相反,建议在调试模式下设置指向已知错误值的指针,以方便诊断和调试。

以上是析构函数中的指针应该设置为 NULL 吗?看看最佳实践和调试。的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!