auto_ptr 指向同一个对象

seujh 2011-11-26 12:21:58
#include <iostream.h>
#include <memory>
class CTest
{
public:
test(){cout <<"test"<<endl;}
};

main()
{
std::auto_ptr<CTest> p(new CTest);

std::auto_ptr<CTest> pp(p); //pp p指向同一个,违背了一句话:不能超过两个auto_ptr指向提供一个对象

//?
p->test();

cout << p.get()<<endl<<pp.get();
}

std::auto_prt<CTest>pp(p); 调用构造函数, pp指向p所指向的 对象,
...全文
86 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qscool1987 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]
std::auto_ptr<CTest> pp(p); 的时候 p里面存储的就是空指针了。
p->test(); 就相当于 CTest* p = 0; p->test();
[/Quote]
p里面存储的就是空指针了。
pengzhixi 2011-11-26
  • 打赏
  • 举报
回复
何谓两个auto_ptr指向同一个p是指这个情况:

int *p=new int;

auto_ptr<int> obj1(p);
auto_ptr<int>obj2(p);
这才是两个auto_ptr指向同一个指针
pengzhixi 2011-11-26
  • 打赏
  • 举报
回复
p里面的原生指针已经是空指针了,所有权被pp接手了。
  • 打赏
  • 举报
回复
std::auto_ptr<CTest> pp(p); 的时候 p里面存储的就是空指针了。
p->test(); 就相当于 CTest* p = 0; p->test();
C++智能指针详解 1、概述 我们知道除了静态内存和栈内存外,每个程序还有⼀个内存池,这部分内存被称为⾃由空间或者堆。程序⽤堆来存储动态分配的对象即那些 在程序运⾏时分配的对象,当动态对象不再使⽤时,我们的代码必须显式的销毁它们。 在C++中,动态内存的管理是⽤⼀对运算符完成的:new和delete。 new:在动态内存中为对象分配⼀块空间并返回⼀个指向对象的指针; delete:指向⼀个动态独享的指针,销毁对象,并释放与之关联的内存。 动态内存管理经常会出现两种问题: (1)⼀种是忘记释放内存,会造成内存泄漏; (2)⼀种是尚有指针引⽤内存的情况下就释放了它,就会产⽣引⽤⾮法内存的指针。 为了更加容易(更加安全)的使⽤动态内存,引⼊了智能指针的概念。智能指针的⾏为类似常规指针,重要的区别是它负责⾃动释放所指向对象。 标准库提供的两种智能指针的区别在于管理底层指针的⽅法不同:shared_ptr和unique_ptr。 (1)shared_ptr允许多个指针指向同⼀个对象; (2)unique_ptr则"独占"所指向对象。 标准库还定义了⼀种名为weak_ptr的伴随类,它是⼀种弱引⽤,指向shared_ptr所管理的对象,这三种智能指针都定义在memory头⽂件 中。 2、auto_ptr (不要使⽤的指针) (1)内部⼤概实现:做成⼀个auto_ptr类,包含原始指针成员。 当auto_ptr类型的对象被释放时,利⽤析构函数,将拥有的原始指针delete掉。 //⼤概长这个样⼦(简化版) template class auto_ptr {   T* ptr; }; (2)⽰例⽤法: void runGame() { std::auto_ptr monster1(new Monster());//monster1 指向 ⼀个怪物 monster1->doSomething();//怪物做某种事 }//runGame函数执⾏完时,monster1被释放,然后它的析构函数也把指向的⼀个怪物释放了 复制auto_ptr对象时,把指针指传给复制出来的对象,原有对象的指针成员随后重置为nullptr。 这说明auto_ptr是独占性的,不允许多个auto_ptr指向同⼀个资源。 void runGame() { std::auto_ptr monster1(new Monster());//monster1 指向 ⼀个怪物 monster1->doSomething(); //怪物做某种事 std::auto_ptr monster2 = monster1; //转移指针 monster2->doSomething(); //怪物做某种事 monster1->doSomething(); //Oops!monster1智能指针指向了nullptr,运⾏期崩溃。 } 注意: 虽然本⽂简单介绍了auto_ptr。 但是不要⽤auto_ptr! 不要⽤auto_ptr! 虽然它是c++11以前的最原始的智能指针,但是在c++11中已经被弃⽤(使⽤的话会被警告)了。 它的替代品,也就是c++11新智能指针unique_ptr,shared_ptr,weak_ptr。 3、shared_ptr(⼀种强引⽤指针) 多个shared_ptr指向同⼀处资源,当所有shared_ptr都全部释放时,该处资源才释放。 (有某个对象的所有权(访问权,⽣命控制权) 即是 强引⽤,所以shared_ptr是⼀种强引⽤型指针) (1)内部⼤概实现:每次复制,多⼀个共享同处资源的shared_ptr时,计数+1。每次释放shared_ptr时,计数-1。 当shared计数为0时,则证明所有指向同⼀处资源的shared_ptr们全都释放了,则随即释放该资源(哦,还会释放new出来的 SharedPtrControlBlock)。 //shared计数放在这个结构体⾥⾯,实际上结构体⾥还应该有另⼀个weak计数。下⽂介绍weak_ptr时会解释。 struct SharedPtrControlBlock {   int shared_count; }; //⼤概长这个样⼦(简化版) template class shared_ptr {   T* ptr;   SharedPtrControlBlock* count; }; (2)⽰例⽤法: void runGame() {   std::shared_ptr monster1(new Monster());  //计数加到1  do{ std::shared_ptr monster
84、智能指针的原理、常⽤的智能指针及实现 、智能指针的原理、常⽤的智能指针及实现 原理 智能指针是⼀个类,⽤来存储指向动态分配对象的指针,负责⾃动释放动态分配的对象,防⽌堆内存泄漏。动态分配的资源,交给⼀个类对 象去管理,当类对象声明周期结束时,⾃动调⽤析构函数释放资源 常⽤的智能指针 (1) shared_ptr 实现原理:采⽤引⽤计数器的⽅法,允许多个智能指针指向同⼀个对象,每当多⼀个指针指向对象时,指向对象的所有智能指针内部的 引⽤计数加1,每当减少⼀个智能指针指向对象时,引⽤计数会 减1,当计数为0的时候会⾃动的释放动态分配的资源。 a.智能指针将⼀个计数器与类指向对象相关联,引⽤计数器跟踪共有多少个类对象共享同⼀指针 b.每次创建类的新对象时,初始化指针并将引⽤计数置为1 c.当对象作为另⼀对象的副本⽽创建时,拷贝构造函数拷贝指针并增加与之相应的引⽤计数 d.对⼀个对象进⾏赋值时,赋值操作符减少左操作数所指对象的引⽤计数(如果引⽤计数为减⾄0, 则删除对象),并增加右操作数所指对 象的引⽤计数 e.调⽤析构函数时,构造函数减少引⽤计数(如果引⽤计数减⾄0,则删除基础对象) (2) unique_ptr unique_ptr采⽤的是独享所有权语义,⼀个⾮空的unique_ptr总是拥有它所指向的资源。转移⼀个 unique_ptr将会把所有权全部从源指针转 移给⽬标指针,源指针被置空;所以unique_ptr不⽀持普通的 拷贝和赋值操作,不能⽤在STL标准容器中;局部变量的返回值除外(因为编 译器知道要返回的对象将 要被销毁);如果你拷贝⼀个unique_ptr,那么拷贝结束后,这两个unique_ptr都会指向相同的资源, 造成在结束 时对同⼀内存指针多次释放⽽导致程序崩溃。 (3) weak_ptr weak_ptr:弱引⽤。 引⽤计数有⼀个问题就是互相引⽤形成环(环形引⽤),这样两个指针指向的内 存都⽆法释放。需要使⽤weak_ptr打 破环形引⽤。weak_ptr是⼀个弱引⽤,它是为了配合shared_ptr ⽽引⼊的⼀种智能指针,它指向⼀个由shared_ptr管理的对象⽽不影响所指 对象的⽣命周期,也就是 说,它只引⽤,不计数。如果⼀块内存被shared_ptr和weak_ptr同时引⽤,当所有shared_ptr析构了之 后,不管还 有没有weak_ptr引⽤该内存,内存也会被释放。所以weak_ptr不保证它指向的内存⼀定是 有效的,在使⽤之前使⽤函数lock()检查weak_ptr 是否为空指针。 (4) auto_ptr 主要是为了解决"有异常抛出时发⽣内存泄漏"的问题 。因为发⽣异常⽽⽆法正常释放内存。 auto_ptr有拷贝语义,拷贝后源对象变得⽆效,这可能引发很严重的问题;⽽unique_ptr则⽆拷贝语 义,但提供了移动语义,这样的错误不 再可能发⽣,因为很明显必须使⽤std::move()进⾏转移。 auto_ptr不⽀持拷贝和赋值操作,不能⽤在STL标准容器中。STL容器中的元素经常要⽀持拷贝、赋值操 作,在这过程中auto_ptr会传递所有 权,所以不能在STL中使⽤。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧