【发布时间】:2011-09-04 13:37:29
【问题描述】:
我目前正在使用 C++/CLI 包装 C++ 类,以实现 .NET 互操作性,遵循在托管类中保存本机指针的标准流程。在一个例子中,我有一个本地类,它的功能如下:
std::shared_ptr<BaseChannel> channelData(const int RunNumber);
我已经开始为BaseChannel 创建一个包装类。但是,如果我将原始指针传递给托管类的构造函数,则无法保证托管类指向的对象的生命周期。 IE。 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
? (参考C++ - passing references to std::shared_ptr or boost::shared_ptr)
【问题讨论】:
-
引用计数增加了(一次是由
spBaseChannel的构造函数,一次是由ChannelUser ctor-initializer 中的new shared_ptr)...但这东西不是当std::shared_ptr不是时,它不会是线程安全的。 -
@Ben:我更新了最后一个问题以正确表达我的担忧。但是,无论如何,我认为您已经在之前的评论中回答了这个问题。引用计数器在 ChannelUser ctor-initializer 中增加。
标签: .net c++-cli wrapper shared-ptr mixed-mode