Функция _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 и дальше с этим что-то делает. Объясните, пожалуйста, что происходит...