Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否应始终在析构函数中清除/归零成员数据?_C++_Destructor - Fatal编程技术网

C++ 是否应始终在析构函数中清除/归零成员数据?

C++ 是否应始终在析构函数中清除/归零成员数据?,c++,destructor,C++,Destructor,是否有充分的理由不清除析构函数中对象的基本成员数据?出于整洁或隐私的考虑,这似乎应被视为标准做法,因为有可能从删除的对象中重新读取数据: #include <iostream> class Box { public: Box(int s) : secret(s), buffer(this) {} ~Box() {} /*BETTER DESTRUCTOR ~Box() {secret = 0;}*/ void

是否有充分的理由不清除析构函数中对象的基本成员数据?出于整洁或隐私的考虑,这似乎应被视为标准做法,因为有可能从删除的对象中重新读取数据:

#include <iostream>

class Box {
    public:
        Box(int s) : secret(s), buffer(this) {}
        ~Box() {}
        /*BETTER DESTRUCTOR ~Box() {secret = 0;}*/
        void print() {std::cout << secret << std::endl;}
    private:
        void* buffer;
        int secret;
};

int main() {
    Box* carton = new Box(8675309);
    Box* crate = carton;
    delete carton;
    crate->print();
}
#包括
类框{
公众:
框(int s):秘密,缓冲区(this){
~Box(){}
/*更好的析构函数~Box(){secret=0;}*/
void print(){std::cout print()

将成员数据归零是否花费了“太多的时间”,以至于认为它不值得(特别是当您必须遍历数组并将每个元素归零时)

显然,对于像STL容器这样的更复杂的数据成员来说,这不是一个问题,因为,也出于调试目的。

如果类包含“secret”事情,然后在解构时清除它将有助于防止它保存在您不再拥有的内存中。但这并不意味着您可以阻止某人在您的应用程序激活对象时拍摄内存快照,因此作为安全措施,它非常差

但一般来说,不,析构函数不应该将类中的内容归零。这是浪费时间


这与“不应删除动态分配结构中的成员”不同当然,这就是例如
std::vector
将要做的。它将销毁向量的所有内容,因为不知道这些元素的析构函数是做什么的。

一个合理的优化器将删除您的
secret=0
赋值

原因很简单。最简单的优化方法之一是删除无效的指令。此类指令的一个常见类别是写入而不是读取。由于
this->secret=0
是析构函数中的最后一条语句,编译器可以轻松地确定您永远不会读取
secre再次执行t
。删除指令很容易保存


您可能想知道为什么要进行这种优化,这种情况会发生多久?答案是“非常频繁”,因为优化不是孤立进行的。例如,在内联调用方未检查错误代码时返回错误代码的函数时,这种写而不读是常见的。内联后,这是对错误代码的写入,而没有匹配的读取。

您误解了链接到的第一个问题。
std::vector
“清除”只是删除它包含的元素,而不是“清除”那么从这里的意义上说。你的代码有未定义的行为。在析构函数中归零不会改变这一点。@juanchopanza我理解代码是人为的。我只是想提供一个例子,说明
delete
只会重新分配内存,而不是真正的“清除”存储在那里的内容。您正在对已删除的对象调用
板条箱->打印()
。这将导致未定义的行为,并且您的
缓冲区不会更改该事实。相关: