ネイティブの.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':この'ポインタを' const WrapTest::AutoPtr'から'WrapTest:: AutoPtr%'に変換できません
誰かが同様の問題を経験しましたか?
回答の背景をさらに詳しく説明するために、署名から「const」キーワードを削除しました。コピーコンストラクターのコードの正確さに関しては微笑んでいないことは知っていますが、CLRはそれをまったく好きではありません。つまり、メモリ管理の核となるCLRを信じています。
署名にconstを残してから、GCHandleまたはpin_ptrを使用して、コピーの実行中にメモリが移動しないようにすることは可能でしょうか。