C ++ / CLI Ajustar una función que devuelve un std :: shared_ptr

Actualmente estoy envolviendo una clase de C ++ con C ++ / CLI para la interoperabilidad de .NET siguiendo el proceso estándar de mantener un puntero nativo en una clase administrada. En un caso, tengo una clase nativa que tiene una función como:

std::shared_ptr<BaseChannel> channelData(const int RunNumber);

Ya comencé a crear una clase de contenedor paraBaseChannel. Sin embargo, si paso el puntero sin formato al constructor de la clase administrada, no hay garantías sobre la vida útil del objeto señalado por la clase administrada. Es decir. shared_ptr podría quedar fuera de alcance y el objeto se eliminará y la clase administrada se quedará con un puntero colgante.

¿Cuál es la solución común para esta situación?

ACTUALIZA

@ Ben: Así que envuelvo la clase que contiene el método en la pregunta anterior así (digamos que está en una clase nativa llamadaNode y se está envolviendo en una clase administrada llamada 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;
}

Porque el shared_ptr no tiene su recuento de referencia aumentado a medida que se pasa a la clase administrada por referencia, eso significa

que mientras este shared_ptr esté dentro del alcance, el objeto al que apunta seguirá existiendo, porque su recuento de referencia será al menos 1

? (ref C ++: pasar referencias a std :: shared_ptr o boost :: shared_ptr)

Respuestas a la pregunta(2)

Su respuesta a la pregunta