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



最近我刚刚看到一个关于 c++ 的视频,解释了成员初始值设定项列表的使用。我想知道是否有办法在解构器中使用成员 uninizializer(或类似的东西(列表。例如,我有一个名为 Entity 的类,它有 2 个私有值 x 和 y,我通过成员初始值设定项列表在我的初始值设定项中将它们都设置为 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成员。 因此,为它们赋值零是没有用的,编译器可能会优化它,因为可观察的行为不会改变。

如果您打算出于加密原因将内存清零,那么分配甚至简单的fillmemset可能都不够 - 它可以被优化出来。 例如,请参阅 cpp首选项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
}
};

最新更新