私は現在、マネージ クラスでネイティブ ポインターを保持する標準プロセスに従って、.NET 相互運用性のために C++/CLI で C++ クラスをラップしています。ある例では、次のような機能を持つネイティブ クラスがあります。
std::shared_ptr<BaseChannel> channelData(const int RunNumber);
のラッパー クラスの作成を既に開始していますBaseChannel
。ただし、生のポインターをマネージド クラスのコンストラクターに渡すと、マネージド クラスが指すオブジェクトの有効期間は保証されません。つまり、shared_ptr がスコープ外になる可能性があり、オブジェクトが削除され、マネージ クラスがダングリング ポインターを保持したままになります。
この状況の一般的な解決策は何ですか?
アップデート
@Ben: したがって、上記の質問でメソッドを保持するクラスを次のようにラップします (それが呼び出されたネイティブ クラスにNode
あり、NodeRef と呼ばれるマネージド クラスにラップされているとしましょう:
ChannelUser^ NodeRef::ChannelData(int runNumber)
{
// mpNode is native class pointer of type Node held in managed class
// wrapper called NodeRef
std::shared_ptr<BaseChannel> spBaseChannel = mpNode->channelData(runNumber);
// ChannelUser is using clr_scoped_ptr to hold the shared_ptr
ChannelUser^ channelUser = gcnew ChannelUser(spBaseChannel);
return channelUser;
}
shared_ptr は参照によってマネージド クラスに渡されるため、参照カウントが増加していないため、ということですか?
この shared_ptr がスコープ内にある限り、参照カウントが少なくとも 1 であるため、それが指すオブジェクトは引き続き存在します。