当我在 C++ 类中包装“原始”资源时,在析构函数代码中,我通常只是简单地释放分配的资源,而不注意其他步骤,例如将指针清零等。 例如:
class File
{
public:
...
~File()
{
if (m_file != NULL)
fclose(m_file);
}
private:
FILE * m_file;
};
我想知道这种代码风格是否包含一个潜在的错误:即是否有可能多次调用析构函数?在这种情况下,正确的做法是在析构函数中将清除指针以避免双重/多重破坏:
~File()
{
if (m_file != NULL)
{
fclose(m_file);
m_file = NULL; // avoid double destruction
}
}
可以为堆分配的内存做一个类似的例子:如果 m_ptr
是一个指向用 new[]
分配的内存的指针,下面的析构函数代码可以吗?
// In destructor:
delete [] m_ptr;
或者是否也应该清除指针以避免双重破坏?
// In destructor:
delete [] m_ptr;
m_ptr = NULL; // avoid double destruction
最佳答案
没有。如果您有 Close()
函数或类似函数,它会很有用:
void Close()
{
if (m_file != NULL)
{
fclose(m_file);
m_file = NULL;
}
}
~File()
{
Close();
}
这样,Close()
函数是幂等的(您可以根据需要多次调用它),并且可以避免在析构函数中进行一次额外的测试。
但由于 C++ 中的析构函数只能调用一次,因此将 NULL 分配给指针毫无意义。
当然,除非出于调试目的,特别是如果您怀疑双重删除。
关于c++ - 指向 "raw"资源的指针应该在析构函数中归零吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9084225/