C++/CLI终结器和操作符

Rya*_*yan 4 .net managed-c++ c++-cli

在以下示例中,我得到:

error C2300: 'UnmanagedClass' : class does not have a finalizer called '!SmartPointer'
Run Code Online (Sandbox Code Playgroud)

如果我删除operator->,则此错误消失.有人可以解释为什么会这样吗?

// Unmanaged class.
class UnmanagedClass { };

public ref class SmartPointer {
public:
    SmartPointer(UnmanagedClass* u) : m_ptr(u) { }
    ~SmartPointer() { this->!SmartPointer(); }
    !SmartPointer() { delete m_ptr; }

    // This line triggers C2300.
    UnmanagedClass* operator->() { return m_ptr; }
};

int main() {
    SmartPointer^ s = gcnew SmartPointer(new UnmanagedClass);
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 5

你覆盖了 - >运算符,所以当你这样做时:

~SmartPointer() { this->!SmartPointer(); }
Run Code Online (Sandbox Code Playgroud)

你有效地打电话了

~SmartPointer() { m_ptr->!SmartPointer(); }
Run Code Online (Sandbox Code Playgroud)

我相信你可以通过这样做来解决这个问题:

~SmartPointer() { (*this).!SmartPointer(); }
Run Code Online (Sandbox Code Playgroud)

  • 得到它:~SmartPointer(){SmartPointer ::!SmartPointer(); } 再次感谢.瑞安 (3认同)