0

ネイティブの.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を使用して、コピーの実行中にメモリが移動しないようにすることは可能でしょうか。

4

1 に答える 1

0

Kenny KerrのAutoPtrを見ると、コンストラクターの所有権が譲渡されます。これは、コピーコンストラクターではなく、基本的に「移動」コンストラクターです。これはstd::auto_ptrに類似しています。

所有権をrhsからこれに本当に譲渡したい場合(つまり、rhsをNativeByteMessageなしのままにする場合)、コピーctorをmovectorに変更する必要があります。

また、初期化構文を使用する必要があります。

// warning - code below doesn't work
ByteMessageWrap (ByteMessageWrap% rhs)
    : m_NativeByteMessage(rhs.m_NativeByteMessage); // take ownership
{
}

ByteMessageWrap% operator=(ByteMessageWrap% rhs)
{
     //SomeManagedClass->NativePointer.Reset(new NativeType);
     if (this == %rhs) // prevent assignment to self
        return *this;

     m_NativeByteMessage.Reset(rhs.m_NativeByteMessage.Release());
     return *this;
}
于 2009-07-16T15:47:11.310 に答える