成员数据是否应始终在析构函数中清除/清零? [英] Should Member Data Always be Cleared/Zeroed in the Destructor?

查看:131
本文介绍了成员数据是否应始终在析构函数中清除/清零?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有充分的理由不清除/清零析构函数中的对象的基本成员数据?为了整洁或隐私,这似乎应该被视为标准做法,因为有一些可能的方法可以重新读取已删除对象的数据:

#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();
}

(请注意,buffer是必需的,因为如果没有它,某些内容将覆盖crate->print()之前的secret。)

将成员数据清零是否花费了"太多时间",从而被认为是不值得的(尤其是在必须遍历数组并将每个元素清零的情况下)?

显然,对于更复杂的数据成员(如STL容器),这不是问题,因为their destructors clear their data,而且pointers should not be cleared用于调试目的。

推荐答案

如果您的类包含"机密"内容,则在描述时将其清除将有助于防止将其保留在您不再拥有的内存中。但这并不意味着当您的应用程序使对象处于活动状态时,您可以阻止某人拍摄内存快照,因此作为一种安全措施,这是非常糟糕的……

但总的来说,不,析构函数不应该将类中的内容置零。纯属浪费时间。

当然,这并不等同于"它不应该删除动态分配的结构中的成员",例如std::vector将会这样做。它将销毁向量的所有内容,因为不知道这些元素的析构函数做了什么。

这篇关于成员数据是否应始终在析构函数中清除/清零?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆