我目前正在使用 C++/CLI 包装一个 C++ 类,以实现 .NET 互操作性,遵循在托管类中保存本机指针的标准过程。在一个例子中,我有一个本地类,它的功能如下:
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