Функция _CreateFtpGrab подгружена из dll-ки (LoadLibrary) и возвращает указатель типа IFtpGrab. Если я пишу:
auto_ptr<IFtpGrab> pFtpGrab = auto_ptr<IFtpGrab>(_CreateFtpGrab(ftpGrabRegSettings.c_str()));
pFtpGrab.reset();
Все работает прекрасно, в частности вызывается деструктор объекта. Если же:
auto_ptr<IFtpGrab> pFtpGrab2 = auto_ptr<IFtpGrab>(_CreateFtpGrab(ftpGrabRegSettings.c_str()));
pFtpGrab2.reset();
В reset() происходит исключение access violation. Я посмотрел отладчиком, оказалось, сначала создается промежуточная структура auto_ptr_ref, которая сохраняет в своем поле _Ref переданный ей указатель, а затем конструктор auto_ptr:
auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()
{ // construct by assuming pointer from _Right auto_ptr_ref
_Ty **_Pptr = (_Ty **)_Right._Ref;
_Ty *_Ptr = *_Pptr;
*_Pptr = 0; // release old
_Myptr = _Ptr; // reset this
}
Который на мой взгляд делает вообще что-то невероятное: трактует указатель на _Ty как указатель на указатель на _Ty и дальше с этим что-то делает. Объясните, пожалуйста, что происходит...
Здравствуйте, AkaSaint, Вы писали:
AS>Функция _CreateFtpGrab подгружена из dll-ки (LoadLibrary) и возвращает указатель типа IFtpGrab. Если я пишу:
AS>AS> auto_ptr<IFtpGrab> pFtpGrab = auto_ptr<IFtpGrab>(_CreateFtpGrab(ftpGrabRegSettings.c_str()));
AS>
Так делать можно, только если Dll'ka и твой код(приложение) используют общий(динамич. загружаемый) run-time и _CreateFtpGrab(...) возвращает указатель на объект выделенный через operator new (+ не забыть про vitual destructor).
Здравствуйте, Polonius, Вы писали:
P>Здравствуйте, AkaSaint, Вы писали:
AS>>Функция _CreateFtpGrab подгружена из dll-ки (LoadLibrary) и возвращает указатель типа IFtpGrab. Если я пишу:
AS>>AS>> auto_ptr<IFtpGrab> pFtpGrab = auto_ptr<IFtpGrab>(_CreateFtpGrab(ftpGrabRegSettings.c_str()));
AS>>
P>Так делать можно, только если Dll'ka и твой код(приложение) используют общий(динамич. загружаемый) run-time и _CreateFtpGrab(...) возвращает указатель на объект выделенный через operator new (+ не забыть про vitual destructor).
Так же следует создавать объект std::auto_ptr так :
auto_ptr<IFtpGrab> pFtpGrab(_CreateFtpGrab(ftpGrabRegSettings.c_str()));
Здравствуйте, AkaSaint, Вы писали:
AS>AS> auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()
AS> { // construct by assuming pointer from _Right auto_ptr_ref
AS> _Ty **_Pptr = (_Ty **)_Right._Ref;
AS> _Ty *_Ptr = *_Pptr;
AS> *_Pptr = 0; // release old
AS> _Myptr = _Ptr; // reset this
AS> }
AS>
AS>Который на мой взгляд делает вообще что-то невероятное: трактует указатель на _Ty как указатель на указатель на _Ty и дальше с этим что-то делает. Объясните, пожалуйста, что происходит...
Это просто баг

Предполагалось, что там указатель на auto_ptr на _Ty:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98871
Здравствуйте, AkaSaint, Вы писали:
AS>Здравствуйте, Polonius, Вы писали:
P>>Так делать можно, только если Dll'ka и твой код(приложение) используют общий(динамич. загружаемый) run-time и _CreateFtpGrab(...) возвращает указатель на объект выделенный через operator new (+ не забыть про vitual destructor).
AS>_CreateFtpGrab использует new и деструктор виртуальный.
AS>А как понять, общий они используют run-time или нет? Может быть, подскажете, где почитать по этой теме?
Можно начать с этого :
http://www.rsdn.ru/article/cpp/crt.xmlАвтор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.