因此,最近我刚刚看了一段有关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;
}
};
答案 0 :(得分:2)
析构函数完成之后,对象将被销毁,您将不再能够访问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
}
};