Не понимаю 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
Re: Не понимаю auto_ptr
От: Polonius Россия  
Дата: 22.09.08 16:06
Оценка:
Здравствуйте, 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).
Дайте мне точку входа, и я переверну мир.
Re[2]: Не понимаю auto_ptr
От: Polonius Россия  
Дата: 22.09.08 16:11
Оценка:
Здравствуйте, 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()));
Дайте мне точку входа, и я переверну мир.
Re: Не понимаю auto_ptr
От: Fwiffo Россия  
Дата: 22.09.08 16:33
Оценка: 1 (1)
Здравствуйте, 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
Re[2]: Не понимаю auto_ptr
От: AkaSaint  
Дата: 23.09.08 09:42
Оценка:
Здравствуйте, Polonius, Вы писали:

P>Так делать можно, только если Dll'ka и твой код(приложение) используют общий(динамич. загружаемый) run-time и _CreateFtpGrab(...) возвращает указатель на объект выделенный через operator new (+ не забыть про vitual destructor).


_CreateFtpGrab использует new и деструктор виртуальный.
А как понять, общий они используют run-time или нет? Может быть, подскажете, где почитать по этой теме?
Re[3]: Не понимаю auto_ptr
От: Polonius Россия  
Дата: 23.09.08 13:04
Оценка:
Здравствуйте, 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 килобайта.
Дайте мне точку входа, и я переверну мир.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.