智能指针相关
2020/3/25
有四种智能指针,其中auto_ptr(已经被11弃用)
申请智能智能很大程度上可以去避免申请空间忘记释放导致的内存泄漏,因为智能指针是一个类,超过作用域之后就会调用析构函数,自动释放掉资源。
这也是它的原理(函数结束,自动释放内存空间)
(1)auto_ptr,采用所有权模式
弃用的原因是存在隐藏的安全隐患
auto_ptr<string> p1(new string("111")) auto_ptr<sting> p2 p2 = p1 //这里不会报错
如果另p2指向p1,p2就剥夺了p1的所有权,当程序去访问p1的时候,就会会报错。
当这个对象生存周期结束了,系统调用析构函数,这个对象会被删除俩次,出错。
它也不能指向数组,因为它做删除用的是delete而不是delete[],所以只会删除数组的第一个元素,所以别用
它也不能够当作STL容器内的元素
存在潜在的内存崩溃问题
(2)unique_ptr
这个智能指针的出现用来代替auto_ptr,它是独占式的,同一时间,只有一个智能指针可以指向一个对象。
还是上个例子,当执行p2 = p1时,不会通过,认为这是非法的(多个智能指针指向同一个对象)
(3)shared_ptr
这个智能指针可以去解决不能共享的问题,比起unique_ptr,在内存中它还会额外多分配一块内存用来保存计数,当多了一个智能指针同时指向共同对象的时候,对象的计数就会+1,只用当所有的智能指针都不在指向对象,计数到0,这块内存才会释放。
(4)weak_ptr
这个智能指针和shared_ptr的不同是,如果用它来指向一个对象,计数是不加1的,它很多时候就像一个检测器,去看看这个对象还存不存在这样子。
或者防止俩个share_ptr互相引用,导致计数永不到0,出现死锁问题。
---------------------------------------