有没有办法在类 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】:析构函数完成后,对象被销毁,您将无法再访问x
和y
成员。因此,为它们分配零是没有用的,编译器可能会优化它,因为可观察的行为没有改变。
如果您的意图是出于加密原因将内存归零,则分配甚至是简单的fill
或memset
可能都不够——它可以被优化掉。例如,参见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++ 中取消初始化变量的主要内容,如果未能解决你的问题,请参考以下文章