【发布时间】:2013-11-26 10:31:26
【问题描述】:
我读到最好在删除指针数据成员后检查类的析构函数,如下所示:
if( 0 != m_pPointer)
{
delete m_pPointer;
m_pPointer= 0;
}
但是,我发现这会阻止您将 const 指针声明为数据成员,如下所示:
Type* const m_pPointer;
将NULL 分配给指针(如我上面的示例)不是 const 正确性的障碍吗?
最好的方法是什么?保留所有 const 并停止将 NULL 分配给已删除的指针或声明 non-const 指针,即使它们的地址永远不会改变?
【问题讨论】:
-
我不同意这是一个好习惯。双重删除指针几乎总是应用程序中的逻辑错误,删除后将指针设置为 null 会隐藏该错误。如果不设置为null,应用程序可能会崩溃,这是一件好事。
-
您是否有一个用例,将指针设置为
0实际上有帮助?我以前见过这种模式,但除非您导出引用指针,否则我看不到它有帮助。 -
@JasonSwartz 不,它不会在删除
null指针时崩溃。delete p;其中p为 null 由语言定义为无操作。有关更多信息,请参阅operator delete。 -
问题是问如何以最少的错误方式使用错误的工具。为什么不使用智能指针?
-
@JasonSwartz:如果指针不共享,而析构函数中只有
deleted,是的,很难意外导致双重删除。另一方面,如果是这样的话,通过将指针重置为null来使代码更复杂是没有意义的——我们在析构函数中,之后就再也看不到指针了! (除非在堆/堆栈损坏的情况下)
标签: c++ pointers c++11 const-correctness