C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 为什么std :: auto_ptr operator = trash objects?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
似乎有std :: auto_ptr和赋值的问题,因此引用的对象似乎由于某种原因而被@L_616_0@.

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.

我已经跟踪了它,并且(通过观察调试器中的值)出现问题发生在从用于包装rhs指针而创建的临时std :: auto_ptr_byref()的指针传输中.这是_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,无论是使用括号还是更改为在rhs上有一个显式的std :: auto_ptr temp,这当然@R_274_10197@.

是仅仅这个版本的库被破坏了,还是我刚刚没有得到的一些潜在的东西?

我们还注意到将一个std :: auto_ptr分配给boot :: shared_ptr的类似问题然我们现在完全@L_616_0@了它,但我不记得哪种语法导致了这个问题.

解决方法

第一行:

std::auto_ptr<AClass> someVar = new AClass();  // should work,but mangles content

应该导致编译器错误.因为没有从原始AClass指针到auto_ptr的隐式转换(将原始指针标记为显式的auto_ptr的构造函数),所以不允许使用“复制初始化程序”形式进行初始化.

VC9给出以下错误

C:\temp\test.cpp(23) : error C2440: 'initializing' : cAnnot convert from 'AClass *' to 'std::auto_ptr<_Ty>'

我尝试过的其他编译器(GCC 3.4.5,Comeau C/C++ 4.3.10.1,Digital Mars)给出了类似的错误.

编辑:

看起来这实际上是VS2005实现auto_ptr<>的一个错误. (不确定它是在SP1中引入的,还是从VS2005开始)在VS2008中得到修复.这是问题的MS Connect错误记录:

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842&wa=wsignin1.0

大佬总结

以上是大佬教程为你收集整理的c – 为什么std :: auto_ptr operator = trash objects?全部内容,希望文章能够帮你解决c – 为什么std :: auto_ptr operator = trash objects?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。