auto_ptr<Date> ap(new Date); auto_ptr<Date> copy(ap); // auto_ptr的问题:当对象拷贝或者赋值后,前面的对象就悬空了 // C++98中设计的auto_ptr问题是非常明显的,所以实际中很多公司明确规定了不能使用auto_ptr ap->_year = 2018; return 0; } 关于上面的问题,为什么会出现悬空,来看看源码 //auto...
unique_ptr (constunique_ptr&) =delete; 可以看到,拷贝操作直接被禁掉了。 在应用方面,auto_ptr由于奇怪的拷贝语义,导致在容器中使用的话很容易出错,比如下面的代码: vector<auto_ptr<int>>foo; ... auto item= foo[0]; 容器中的元素不知不觉就被改掉了(置为null)。 如果是unique_ptr,就看得很清楚了...
程序执行时p->f()和p.operator->()->f()的结果一样,看了auto_ptr模板类的实现,发现其中对->操作符的定义如下: _Tp* operator->() const __STL_NOTHROW { return _M_ptr; } 不理解的是p->f()这个调用是如何做到的?难道在调用时做了p到p.opertaor->()的隐式转换?但在auto_ptr模板类的定义中...
因此,C11标准之前的auto_ptr这个智能指针不被广泛使用的原因就是:在某些应用场景下,拷贝构造函数的意义不明确,同理赋值语句也是这个道理,意义同样不明确,因为C11标准之前并不存在移动赋值和移动构造的概念,还有就是之前谈到的一个对象和一组对象的问题,对于自定义类型而言,auto_ptr的析构函数仅能够析构一个对象,不能...
原因在于std::auto_ptr支持拷贝构造,为了确保指针所有者唯一,这里转移了所有权! 是auto_ptr的问题吗 上面的使用场景是原始指针的常规且高频使用的场景,而auto_ptr仅仅是在原始指针的基础上加入了资源自动释放的功能而已,所以其使用完全符合逻辑,没毛病!
unique_ptr:类似于auto_ptr,unique_ptr也用于管理单个对象的内存,但它不会发生所有权转移的问题。unique_ptr通过禁用拷贝构造函数和拷贝赋值运算符,确保了对象的所有权唯一性。同时,unique_ptr支持自定义删除器,可以方便地管理不同类型的资源。 shared_ptr:用于管理多个指针共同拥有的对象。shared_ptr通过引用计数机制,...
智能指针的最主要的作用防止裸指针带来的很多问题,如指向无效内存的指针,或者可能出现的内存泄露。其实我不建议你看这个auto_ptr,因为在实际开发中,很少使用这个,而是使用boost库的shared_ptr,比auto_ptr更好用,更安全。如果你学会了shared_ptr,自然也会用auto_ptr了。并且vs2010里已经提供了与...
auto_ptr<string> p2; p2 = p1; //auto_ptr不会报错 1. 2. 3. 如果p1和p2是普通指针,那么两个指针将指向同一个string对象。那么在删除同一个对象两次的时候,会出错。要避免这种问题,方法有多种: (1)定义陚值运算符,使之执行深复制。这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本...
unique_ptr:类似于auto_ptr,unique_ptr也用于管理单个对象的内存,但它不会发生所有权转移的问题。unique_ptr通过禁用拷贝构造函数和拷贝赋值运算符,确保了对象的所有权唯一性。同时,unique_ptr支持自定义删除器,可以方便地管理不同类型的资源。 shared_ptr:用于管理多个指针共同拥有的对象。shared_ptr通过引用计数机制,...
个别Visual C++ 程序员说他们在STL容器中使用auto_ptr时从来没有遇到过任何问题。告诉你吧,这是暂时的,因为Visual C++ (所有版本)的 auto_ptr 实现都将过期,所依赖的规范都将作废。只要微软决定向最新的ANSI/ISO C++ 标准靠拢(这已经是大势所趋),并对其标准库作相应修改。那么在STL容器中使用 ...