首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么std :: auto_ptr operator = trash objects?

在C++中,std::auto_ptr是一个智能指针,用于管理动态分配的对象。当std::auto_ptr对象被赋值时,它会将其指向的对象删除,并将其指向新的对象。

std::auto_ptr的赋值操作符operator=被定义为将其左侧的std::auto_ptr对象指向新的对象,并删除原来指向的对象。如果右侧的对象是一个空指针,那么std::auto_ptr对象将不会执行任何操作。

因此,当std::auto_ptr对象被赋值为trash objects时,它将删除原来指向的对象,并将其指向新的对象。这是std::auto_ptr的设计目的,即自动管理动态分配的对象的内存。

需要注意的是,std::auto_ptr已经被C++11标准废弃,并被std::unique_ptr替代。std::unique_ptr提供了更安全和更灵活的智能指针实现,可以避免许多由std::auto_ptr引起的问题。因此,建议使用std::unique_ptr来代替std::auto_ptr

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ 智能指针详解

::endl;   }   std::string info_extend;   int number; }; 2、std::auto_ptr std::auto_ptr 属于 STL,当然在 namespace...所以,使用 std::auto_ptr 时,绝对不能使用“operator=”操作符。作为一个库,不允许用户使用,确没有明确拒绝[1],多少会觉得有点出乎预料。...总结:std::auto_ptr 可用来管理单个对象的对内存,但是,请注意如下几点: (1)    尽量不要使用“operator=”。如果使用了,请不要再使用先前对象。...(3)    std::auto_ptr 最好不要当成参数传递(读者可以自行写代码确定为什么不能)。...(4)    由于 std::auto_ptr 的“operator=”问题,有其管理的对象不能放入 std::vector 等容器中。

1.9K10

智能指针-使用、避坑和实现

本文主要内容如下图所示: 智能指针的由来 auto_ptr为什么被废弃 unique_ptr的使用、特点以及实现 shared_ptr的使用、特点以及实现 weak_ptr的使用、特点以及实现 介绍笔者在工作中遇到的一些职能指针相关的坑...首先我们看下auto_ptr的简单实现(为了方便阅读,进行了修改,基本功能类似于std::auto_ptr): template class auto_ptr { T*...*p; } T* operator->() const { return p; } }; 从上面代码可以看出,auto_ptr采用copy语义来转移所有权,转移之后,其关联的资源指针设置为...p; } T& operator*() const { return *p; } }; 从上面代码基本可以看出,unique_ptr的控制权转移是通过move语义来实现的,相比于auto_ptr...那么,为什么将SubController中的shared_ptr换成weak_ptr就能解决这个问题呢?

85010

智能指针探究

,那为什么呢,p1和p2不都是指向同一块内存吗 这时候咱们可以看下auto_ptr的拷贝构造函数看看了 auto_ptr(auto_ptr& _Right) noexcept : _Myptr(_Right.release...,所以这样说的话auto_ptr是有些问题的,所以你也能看到一般也都是不推荐使用auto_ptr 经常会被问到能不能再容器当中使用auto_ptr,其实尽量是别搞 vector<auto_ptr<int...::move(p1)); 运行后发现是可以的,那是为什么呢 再看它的源码 发现提供了类似这样的函数 unique_ptr(unique_ptr &&src) unique_ptr& operator...当你使用std::move函数将一个unique_ptr对象转化为右值引用并将其传递给另一个unique_ptr对象来初始化时,就会调用这个构造函数 unique_ptr& operator=(unique_ptr...这样p1的所有权转移给p2,p1变为空指针 三四行代码,不涉及构造赋值运算符,只涉及到移动构造函数 这时候肯定会说,那和auto_ptr也一样啊,但unique_ptr p2(std::move

7010

C++语言基础篇

,⾸先,说⼀下为什么要使⽤智能指针:智能指针其作⽤是管理⼀个指针,避免咋们程序员申请的空间 在函数结束时忘记释放,造成内存泄漏这种情况滴发⽣。...常⽤接⼝ T* get(); T& operator*(); T* operator->(); T& operator=(const T& val); T* release(); void reset...(T* ptr = nullptr); T是模板参数, 也就是传⼊的类型; get() ⽤来获取 auto_ptr 封装在内部的指针, 也就是获取原⽣指针; operator() ᯿载 , operator...->() ᯿载了->, operator=()᯿载了=; realease() 将 auto_ptr 封装在内部的指针置为 nullptr, 但并不会破坏指针所指向的内容, 函数返回的是内部指 针置空之前的值...auto_ptr p1 (new string ("hello")); auto_ptr p2; p2 = p1; //auto_ptr 不会报错

52430

从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

//抽象类 class BinaryNode : public Node { public:     BinaryNode(std::auto_ptr& left, std::auto_ptr...:     AddNode(std::auto_ptr& left, std::auto_ptr& right)         : BinaryNode(left, right...实际上auto_ptr 是值语义(将对象语义转换为值语义),auto_ptr 之所以不能作为STL容器的元素,关键在于第3点,即 auto_ptr的拷贝构造或者赋值操作会改变右操作数,如下的代码: std...接管val所有权         std::vector::push_back(val);       // operator new         ptr.release();     }...::vector::push_back(val);  成功(operator new 成功),那么局部智能指针对象释放裸指针的所有权;如果 std::vector::push_back

1.8K00

智能指针入门 auto_ptr

我们无需关心销毁只管尽情的申请,系统提供了一个 auto_ptr 类可以使用这样的功能。后面我们也会用简单的代码示例介绍 auto_ptr 内部是如何实现的。...代码如下: #include #include using namespace std; class A { public: A(){cout << “A constructor” << endl;...* argv[]) { foo(); return 0; } 以上代码运行后,如下图: 从图中我们可以看到,我们只做了申请操作,而并未对new出来的指针进行销毁,为什么会打印类 A 的析构函数中的内容呢...其实想搞清楚这件事情并不难,请大家看如下代码,并仔细查看我所做的注释: #include #include using namespace std; class A { public: A() {...->() { return _p; } // 重载*,可以对构造出来的对象解引用 A& operator*() { return *_p; } private: A* _p; }; void foo()

14920

【C++】智能指针

一、为什么需要智能指针? 在我们异常一节就已经讲过,当使用异常的时候,几个函数层层嵌套,其中如果抛异常就可能导致没有释放堆区开辟的空间。这样就很容易导致内存泄漏。...---- 三、标准库中的智能指针 1.std::auto_ptr 参考文献:std::auto_ptr auto_ptr 是C++库中的第一个智能指针,其在面对拷贝构造的解决办法是:转移所有权(当用当前的智能指针对象拷贝出一个新对象时...int main() { std::auto_ptr ap1(new int(10)); std::auto_ptr ap2(ap1); cout << *ap1 << endl..._ptr = nullptr; } auto_ptr& operator=(auto_ptr& ap) { // 检测是否为自己给自己赋值 if (this !...->() { return _ptr; } private: T* _ptr; }; 2.std::unique_ptr 参考文献: std::unique_ptr

20820

C++智能指针「建议收藏」

C++11提供的scoped_ptr,unique_ptr (1)auto_ptr auto_ptr ptr1(new int); auto_ptr ptr2(ptr1)...; 我们运行,发现程序崩溃 这是因为构造ptr2时将ptr1置空了,析构ptr1时出错 auto_ptr源码 auto_ptr(auto_ptr& _Right) noexcept : _Myptr...构造可以看到,auto_ptr底层先是将ptr1置空,然后将指向的资源再给ptr2, auto_ptr所做的就是使最后一个构造的指针指向资源,以前的指针全都置空,如果再去访问以前的指针就是访问空指针了,...所以一般不使用auto_ptr 一般我们也不在容器中使用auot_ptr,以下程序会导致vec1中的指针元素全部为NULL vector> vec1; vector<auto_ptr...auto_ptr可以任意转移资源的所有权,而scoped_ptr不会转移所有权(因为拷贝构造和赋值被禁止了) 由于scoped_ptr无法进行任何的拷贝构造函数和operator=赋值,一般也不推荐使用

42910

【C++11】智能指针

单纯的浅拷贝会导致空间多次释放,因为根据智能指针解决卡搜被问题方式不同,所以有很多版本的智能指针 ---- 三、C++中的智能指针 auto_ptr auto_ptr的使用 auto_ptr让管理权限进行了转移...() { std::auto_ptr ap1(new int(1)); std::auto_ptr ap2(ap1); *ap2 = 10; //*ap1 = 10;错误的写法...std::auto_ptr ap3(new int(1)); std::auto_ptr ap4(new int(2)); ap3 = ap4; return 0; } 资源的管理权转移意味该对象不能在对原来管理的资源进行访问了...(auto_ptr& sp) :_ptr(sp....而如果连接结点时只进行一个连接操作,那么当node1和node2的生命周期结束时,就会有一个资源对应的引用计数被减为0,此时这个资源就会被释放,这个释放后另一个资源的引用计数也会被减为0,最终两个资源就都被释放了,这就是为什么只进行一个连接操作时这两个结点就都能够正确释放的原因

20240

智能指针的讲解

1.为什么要智能指针 首先我们分析一段代码: 1、如果p1这里new 抛异常会如何? 2、如果p2这里new 抛异常会如何? 3、如果div调用这里又会抛异常会如何?...class T> class auto_ptr { public: auto_ptr(T* ptr) :_ptr(ptr) {} auto_ptr(auto_ptr& sp..._ptr = nullptr; } auto_ptr& operator=(auto_ptr& ap) { //赋值也会涉及管理权转移的问题 // 检测是否为自己给自己赋值...是一个失败设计,很多公司明确要求不能使用auto_ptr 3.4 std::unique_ptr 在经历了C++98的失败后,C++11提供了更加靠谱的unique_ptr http://www.cplusplus.com...模拟实现如下: 可能有人会问,为什么不直接用int一个count呢,大家想如果都用用int,那么每个对象都会出现一个计数count,如果是多个对象管理一块资源呢?

9311
领券