【问题标题】:Is there a way to uninitialize variables in a class c++有没有办法在类 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% 的时间将被优化掉,因为它没有任何效果。

标签: c++ class constructor


【解决方案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
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多