有没有办法在类 c++ 中取消初始化变量

Posted

技术标签:

【中文标题】有没有办法在类 c++ 中取消初始化变量【英文标题】:Is there a way to uninitialize variables in a class c++ 【发布时间】:2019-09-12 19:50:03 【问题描述】:

所以最近我刚刚看到一个关于 c++ 的视频,它解释了成员初始化器列表的使用。我想知道是否有办法在解构器中使用排序的成员 uninizializer(或类似的东西)列表。例如,我有一个名为 Entity 的类,它有 2 个私有值 x 和 y,我在我的 Initializer 中通过成员初始化器列表将它们都设置为 5,但我必须以正常方式在解构器中取消初始化它们(x = 0;. ..)。

class Entity

private:
    int x, y;
public:
    Entity(): x(5), y(5)
    
    

    ~Entity() //Here I want to set x and y to 0 like this: x(0), y(0)
    
        x = 0;
        y = 0;
    
;

【问题讨论】:

在它们不复存在之前将它们设置为零的目的是什么? 听起来像是 XY 问题。为什么要这样做? 当你想“取消初始化”一个微不足道的对象时,你可以忽略它的当前值。无论如何,它不是可测试的属性。如果你愿意,就假装它是未初始化的。 使用 RAII。换句话说,将您的整数包装到一个带有析构函数的类中,该析构函数将值设置为零。然后,您不需要为使用这些包装的 int 的类编写析构函数。但是,确实,为什么? @hyde 99.999% 的时间将被优化掉,因为它没有任何效果。 【参考方案1】:

析构函数完成后,对象被销毁,您将无法再访问xy 成员。因此,为它们分配零是没有用的,编译器可能会优化它,因为可观察的行为没有改变。

如果您的意图是出于加密原因将内存归零,则分配甚至是简单的fillmemset 可能都不够——它可以被优化掉。例如,参见cppreference memset。您可能必须使用更复杂的东西,例如:

~object()

    std::fill(const_cast<volatile T*>(data.begin()),
              const_cast<volatile T*>(data.end()),
              0);

如果您的意图是编写一个在销毁时释放资源的 RAII 类,您可能不想简单地重置资源处理程序的值。例如:

template <typename T>
class object 
    T* elem;
public:
    // ...
    template <typename... Args>
    object(std::in_place_t, Args&&... args) // for example
    
        elem = new T(std::forward<Args>(args)...);
    
    ~object()
    
        delete elem; // elem = nullptr won't work
    
;

【讨论】:

以上是关于有没有办法在类 c++ 中取消初始化变量的主要内容,如果未能解决你的问题,请参考以下文章

C++中静态成员变量的可以在类内初始化吗?

C++中静态成员变量(不支持在类定义中初始化不是常量的静态数据成员)

有没有办法让 C++ 结构值初始化所有 POD 成员变量?

C++静态成员变量及其初始化

C++只能实例化1个对象的类

C++静态成员变量初始化