分配运算符更改分配对象的值

rkg*_*ghz 1 c++ destructor assign

我实现了一个类来处理一些外部功能(例如,另一个DLL的功能)。这个函数给了我一个可以用作句柄的整数。这是我的代码的重要部分:

MyClass
{
public:
    MyClass() { 
        handle = getHandlefromExternalFunction();
    }
    ~MyClass {
        if(handle>0)
            freeHandleFromExternalFunction(handle);
    }
    MyClass& operator=(MyClass& other) {
        freeHandleFromExternalFunction(handle);
        handle = other.handle
        other.handle = 0; //Is this a bad idea?
    }
private:
    int handle;
}
Run Code Online (Sandbox Code Playgroud)

在我的主要功能中,我有一个myClass对象。在某些时候,我正在使用赋值运算符来更改对象的值:

MyClass object;
//some code
object = MyClass();
Run Code Online (Sandbox Code Playgroud)

分配后,创建的对象MyClass()将立即销毁,因为它超出了范围。但是我不想freeHandleFromExternalFunction()被调用handle,因为我在分配的对象中使用它。因此,我在赋值运算符中更改了赋值对象的值handle = 0。我的问题是:这是个坏主意吗?有谁能更好地解决我的问题?

Som*_*ude 6

是的,这是一个坏主意。通常,您不希望分配的右侧被修改。

如果要移动所有权,则将“移动”赋值运算符与一起使用std::move

MyClass& operator=(MyClass&& other) { ... }

// ...

MyClass a = ...;
MyClass b;

b = std::move(a);
Run Code Online (Sandbox Code Playgroud)

如果你只是想这样的运动(其中可能包含的资源只有一个所有者),那么我也建议你标记拷贝构造函数和拷贝赋值运算符的删除:

MyClass& operator=(MyClass const&) = delete;
MyClass(MyClass const&) = delete;
Run Code Online (Sandbox Code Playgroud)

遵循五个规则,不要忘记移动构造函数和析构函数:

~MyClass() { ... }
MyClass(MyClass&& other) { ... }
Run Code Online (Sandbox Code Playgroud)

  • 我强烈建议也实现MyClass(MyClass &&)构造函数,并实现或显式删除副本构造函数和副本分配。#RuleOfFive (2认同)