В настоящее время я обертываю класс C ++ с C ++ / CLI для взаимодействия .NET, следуя стандартному процессу удержания собственного указателя в управляемом классе. В одном случае у меня есть нативный класс, который имеет такую функцию:
std::shared_ptr<BaseChannel> channelData(const int RunNumber);
Я уже начал создавать класс-оболочку для BaseChannel
. Однако, если я передам необработанный указатель в конструктор управляемого класса, нет никаких гарантий относительно времени жизни объекта, на который указывает управляемый класс. То есть shared_ptr может выйти из области видимости, и объект будет удален, а управляемый класс останется с висящим указателем.
Какое общее решение для этой ситуации?
UPDATE
@ 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
? (ref C ++ - передача ссылок на std :: shared_ptr или boost :: shared_ptr )