Не понимаю auto_ptr
От: AkaSaint  
Дата: 22.09.08 15:46
Оценка:
Функция _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 и дальше с этим что-то делает. Объясните, пожалуйста, что происходит...
auto_ptr
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.