Похоже, возникла проблема с std :: auto_ptr и присваиванием, из-за чего объект, на который есть ссылка, по какой-то причине оказывается удаленным.
std::auto_ptr<AClass> someVar = new AClass(); // should work, but mangles content
std::auto_ptr<AClass> someVar( new AClass() ); // works fine.
std::auto_ptr<AClass> someVar = std::auto_ptr<AClass>(new AClass()); // works fine.
std::auto_ptr<AClass> someVar;
someVar.reset( new AClass() ); // works fine.
Я проследил это, и выяснилось (наблюдая за значениями в отладчике), что проблема возникает при передаче указателя из временного std :: auto_ptr_byref (), созданного для обертывания указателя rhs. Это значение, содержащееся в _Right при входе в функцию auto_ptr (auto_ptr_ref ‹_Ty> _Right), является правильным, но значение в _Myptr при выходе является нежелательным.
template<class _Ty>
struct auto_ptr_ref
{ // proxy reference for auto_ptr copying
auto_ptr_ref(void *_Right)
: _Ref(_Right)
{ // construct from generic pointer to auto_ptr ptr
}
void *_Ref; // generic pointer to auto_ptr ptr
};
template<class _Ty>
class auto_ptr
{ // wrap an object pointer to ensure destruction
public:
typedef _Ty element_type;
explicit auto_ptr(_Ty *_Ptr = 0) _THROW0()
: _Myptr(_Ptr)
{ // construct from object pointer
}
auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
: _Myptr(_Right.release())
{ // construct by assuming pointer from _Right 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
}
auto_ptr<_Ty>& operator=(auto_ptr_ref<_Ty> _Right) _THROW0()
{ // assign compatible _Right._Ref (assume pointer)
_Ty **_Pptr = (_Ty **)_Right._Ref;
_Ty *_Ptr = *_Pptr;
*_Pptr = 0; // release old
reset(_Ptr); // set new
return (*this);
}
Сначала я подумал, что это испортило наследование и отсекло интерфейсы, однако это происходит, даже если у класса есть только один родительский класс.
Мы можем избежать использования = new, если вспомним, либо используя скобки, либо изменив явную временную температуру std :: auto_ptr в правой части, это, конечно, подвержено ошибкам.
Это просто сломанная версия библиотеки или какая-то основная вещь, которую я просто не понимаю?
Мы также заметили аналогичную проблему с назначением std :: auto_ptr для boot :: shared_ptr, хотя мы полностью удалили это сейчас, и я не помню, какой синтаксис вызвал проблему.
auto_ptr
сложно использовать и обдумывать, и его нельзя, например, хранить в контейнерах STL. - person Niklas   schedule 09.01.2009