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。我的问题是:这是个坏主意吗?有谁能更好地解决我的问题?
是的,这是一个坏主意。通常,您不希望分配的右侧被修改。
如果要移动所有权,则将“移动”赋值运算符与一起使用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)