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

我有一个类,它有一个常量成员、常量指针和枚举类成员

我对示例代码的问题如下:

  • 如何在move构造函数中对“other”`的枚举类成员进行nulify 正确(分配给它什么值?)
  • 如何使move构造函数中的“other”`常量指针为空 other的析构函数不会删除 正在构造,因此指针是有效的
  • 如何使move构造函数中“other”的常量成员为空 另一个的析构函数没有被调用

  • 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;
    };