C++ C++;移动构造函数和常量成员指针或常量成员,如何加密它们以避免内存泄漏?
我有一个类,它有一个常量成员、常量指针和枚举类成员 我对示例代码的问题如下:C++ C++;移动构造函数和常量成员指针或常量成员,如何加密它们以避免内存泄漏?,c++,move-constructor,C++,Move Constructor,我有一个类,它有一个常量成员、常量指针和枚举类成员 我对示例代码的问题如下: 如何在move构造函数中对“other”`的枚举类成员进行nulify 正确(分配给它什么值?) 如何使move构造函数中的“other”`常量指针为空 other的析构函数不会删除 正在构造,因此指针是有效的 如何使move构造函数中“other”的常量成员为空 另一个的析构函数没有被调用 enum类enum类 { VALUE0,//这是零 价值1 }; 类MyClass { 公众: MyClass(): 成员(E
enum类enum类
{
VALUE0,//这是零
价值1
};
类MyClass
{
公众:
MyClass():
成员(EnumClass::VALUE1),
x(10.f),
y(新整数(4)){}
MyClass(MyClass和其他):
成员(其他成员),
x(其他.x),
y(其他y)
{
//我是否可以肯定,这种做法将使“成员”无效,并避免
//其他函数的析构函数调用
other.member=EnumClass::VALUE0;
//还是我应该用这种方法?
other.member=静态_cast(0);
//错误如何将“x”置零以避免对其他函数的析构函数调用?
其他.x=0.f;
//这里的错误相同,delete将被调用两次!
其他。y=空ptr;
}
~MyClass()
{
删除y;
}
私人:
班级成员;
常量浮点x;
整数*常数;
};
您不必担心非指针类型的空值问题。不能多次“释放”它们,因为它们的数据位于类内部,而不是堆上。您的const int指针确实需要为空,而且看起来您这样做是对的
有关更多信息,请参阅这篇MDSN文章:
编辑:
如果声明int*const y,则将指针声明为const。如果只是希望int为const,则将其声明为const int*y。无法更改声明为int*const y的指针的地址。可以将0作为特例,使枚举从1开始吗?@Plasmah这有什么帮助?另外,我花了20分钟,但在我的帖子中无法解决这个代码标记,它就是不起作用。如果你想更改一个值,你就不能让它常量。就这么简单。我相当肯定,如果你的类包含常量指针,你将无法给出一个令人满意的移动构造的答案。您在编写赋值运算符(基于复制或移动)时也会遇到类似的问题。您必须确定是否值得将指针更改为非常量以节省成本。提供的MSDN文章的可能副本无法解释我的问题,因为该文章没有使用const成员,您所说的“看起来您做得对”是什么意思?我做得不对,因为我的代码没有编译:DWhoops,错过了整个const部分。如果声明int*const y,则将指针声明为const。如果只是希望int为const,则将其声明为const int*y。无法更改声明为int*const y的指针的地址。无法释放非指针类型,但最好不要在发生移动后继续以有效状态存在。
enum class EnumClass
{
VALUE0, // this is zero
VALUE1
};
class MyClass
{
public:
MyClass() :
member(EnumClass::VALUE1),
x(10.f),
y(new int(4)) { }
MyClass(MyClass&& other) :
member(other.member),
x(other.x),
y(other.y)
{
// Can I be sure that this approach will nullify a "member" and avoid
// destructor call of other
other.member = EnumClass::VALUE0;
// Or shall I use this method?
other.member = static_cast<EnumClass>(0);
// ERROR how do I nullify "x" to avoid destructor call of other?
other.x = 0.f;
// ERROR the same here, delete is going to be called twice!
other.y = nullptr;
}
~MyClass()
{
delete y;
}
private:
EnumClass member;
const float x;
int* const y;
};