在析构函数中将指针设置为 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中文网其他相关文章!