Я читаю " Использование shared_ptr в dll-интерфейсах ". В этом посте Флипси предложил способ пропустить объект, не связанный с реализацией, через границы DLL, в конце своего ответа. По сути, идея состоит в том, чтобы вернуть необработанный указатель из DLL и инициализировать shared_ptr
в EXE с этим необработанным указателем.
Я не думаю, что это правильно. Позвольте мне перепрототипировать его для простоты.
// wrong version??
// DLL
Object* createObject()
{
return new Object;
}
// EXE
std::tr1::shared_ptr<Object> p(createObject());
..
Когда object
освобождается, контекст / куча уничтожения, используемый shared_ptr
, отличается от используемого в DLL во время построения.
Правильный способ использования shared_ptr
заключается в том, что распределение ресурсов должно быть в одной строке с инициализацией shared_ptr
, чтобы при распределении и освобождении можно было использовать одну и ту же кучу, как показано ниже.
// right version
// DLL
std::tr1::shared_ptr<Object> createObject()
{
return std::tr1::shared_ptr<Object>(new Object);
}
// EXE
std::tr1::shared_ptr<Object> p(createObject());
..
Я прав?