我有一个围绕原生 .lib 和 .h 文件的 C++/CLI 包装器。我在包装类中广泛使用 AutoPtr 类来管理我为包装创建的非托管对象。我遇到了复制构造函数/赋值运算符的障碍。
使用 Kerr 先生的 AutoPtr 类:http ://weblogs.asp.net/kennykerr/archive/2007/03/26/AutoPtr.aspx
他建议以下(在评论中)重新创建赋值运算符的行为:
SomeManagedClass->NativePointer.Reset(new NativeType);
我相信这是真的。但是当我编译我的代码时:
ByteMessageWrap (const ByteMessageWrap% rhs)
{
AutoPtr<ByteMessage> m_NativeByteMessage(rhs.m_NativeByteMessage.GetPointer());
};
ByteMessageWrap% operator=(const ByteMessageWrap% rhs)
{
//SomeManagedClass->NativePointer.Reset(new NativeType);
if (this == %rhs) // prevent assignment to self
return *this;
this->m_NativeByteMessage.Reset(rhs.m_NativeByteMessage.GetPointer());
return *this;
};
-- 我收到以下错误:
错误 C2662:“WrapTest::AutoPtr::GetPointer”:无法将“this”指针从“const WrapTest::AutoPtr”转换为“WrapTest::AutoPtr %”
有没有人遇到过类似的问题?
有关答案的更多背景信息,我从签名中删除了“const”关键字。我知道在复制 ctor 的代码正确性方面并没有笑,但 CLR 根本不喜欢它——有点掩盖了 CLR 的核心与内存管理。
我想知道是否可以将 const 留在签名中,然后使用 GCHandle 或 pin_ptr 确保在执行复制时内存不会移动?