gpt4 book ai didi

C++ 析构函数约定

转载 作者:太空狗 更新时间:2023-10-29 19:53:07 25 4
gpt4 key购买 nike

我在 C++ 中看到很多类似下面示例的代码,通常建议将其作为约定:

class Foo
{
public:

Foo()
{
bar = new int[100];
size = 100;
}

// ... copy/assignment stuff ...

~Foo()
{
if (bar) // <--- needed?
{
delete[] bar;
bar = nullptr; // <--- needed?
}

size = 0; // <--- needed?
}

private:

int* bar;
int size;
};

对我来说,这三个语句 if (bar) { ... }bar = nullptr;size = 0;有两个原因是多余的:

  1. delete nullptr; 非常安全,它什么都不做。
  2. 如果对象被销毁并释放内存,我不应该担心将 bar 设置为 nullptr 并将 size 设置为0.

这些理由是否正确?这些说法真的是多余的吗?如果是这样,为什么人们会继续使用并推荐它们?我希望看到一些可以通过保留此约定来解决的潜在问题。

最佳答案

你是对的,这些是不需要的,一些编译器无论如何都会优化它们。

但是 - 人们通常这样做的原因是为了帮助发现问题。例如,假设您没有将指针设置为空。该对象已被销毁,但随后您错误地尝试访问(曾经的)指针。由于运行时可能不会清除它,您仍然会在那里看到一些有效的东西。这只有在调试时才有值(value),它仍然是未定义的行为,但有时会有所返回。

关于C++ 析构函数约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17728421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com