智能指针

C++智能指针解析

流过昼夜 提交于 2019-11-30 02:14:57
前言 在C++程序中,内存分为三种静态内存、栈内存、堆内存。其中静态内存和栈内存由系统进行维护,而堆内存则是由程序员自己进行维护,也就是我们在new和delete对象时,这些对象存放的区域。任何有C++开发经验的人都知道,在程序中 new 和 delete 必须成对使用,当我们动态申请的对象不再使用时,一定要记得使用delete释放,不然就会造成内存泄漏。然而,在程序最容易出现的问题就是,记得申请而忘记了释放;还有一种是其他引用还在使用,结果提前释放引发了内存引用异常……。 于是为安全使用动态内存,在C++ 11中,新增了指针神器——智能指针。智能指针能自动在生命周期结束后负责对内存资源进行释放。 定义智能指针的三个类全部定义在memory头文件中。它们分别是 shared_ptr :共享指针,允许多个指针指向同一对象 unique_ptr :独占指针,该指针独占所指向的对象 weak_ptr :弱引用,指向shared_ptr所管理的对象。 来源: https://www.cnblogs.com/fancy-li/p/11446927.html

智能指针(一)

不想你离开。 提交于 2019-11-30 01:07:27
1 引入 C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。管理是麻烦点(e.g. 手动释放等),但无伤大雅,勉强可以接受;但要命的是,容易出问题: 内存泄露:忘记手动释放 或 由于异常存在跳过释放等,都会导致内存泄漏; 悬挂指针: 二次释放:多次释放同一指针会导致程序崩溃。 为了解决该问题,C++ 11 引入智能指针概念使内存管理变得更为方便,且不易出错: 从较浅的层面看,智能指针是利用了一种叫做RAII(资源获取即初始化)的技术对普通的指针进行封装,这使得智能指针实质是一个对象,行为表现的却像一个指针; 智能指针的作用是防止忘记调用delete释放内存和程序异常的进入catch块忘记释放内存。另外指针的释放时机也是非常有考究的,多次释放同一个指针会造成程序崩溃,这些都可以通过智能指针来解决。 智能指针包含在头文件<memory>中,包括:shared_ptr、unique_ptr、weak_ptr。 2 shared_ptr 对于一个对象,允许有多个shared_ptr指向该对象,并使用引用计数方式统计指向该对象的shared_ptr个数。 每多一个shared_ptr指向该对象,引用计数加一;每少一个shared_ptr指向该对象,引用计数减一;当引用计数为0时,自动删除所指向的堆内存; 注意不要用一个原始指针初始化多个shared_ptr

C++11的智能指针总结

五迷三道 提交于 2019-11-29 19:30:57
到现在为止遇到了几种智能指针 shared_ptr 特点:可以自动销毁,并且可以多个指针指向同一块动态内存,内部有一个计数器,等到计数器为零就会自动销毁 weak_ptr 特点:是shared_ptr指针的附属,weak_ptr指向shared_ptr的区域,但并不会增加shared_ptr的计数器值,而且也不可以直接使用,需要lock(),提升为shared_ptr才可以使用。 scope_ptr 特点:也可以自动释放,但是不能和其他指针共享内存,也就是一块共享内存只能有一个scope_ptr指针,因为scope_ptr在销毁时是直接销毁这个指针指向的动态内存,如果有其他指针一起指向,那么其他指针就没有用了。 并且这个指针不能进行移动和复制操作的,可以交换 unique_ptr:也可以自动释放,但是不能和其他指针共享内存,也就是一块共享内存只能有一个scope_ptr指针 但是这个指针可以移动,不能复制 unique_ptr<TEST> p2(p1.release()); 例如上面程序就是把p1指向的内容转给了p2,然后p1指向NULL 来源: https://blog.csdn.net/qq_34489443/article/details/100898623

语言基础(23):智能指针

夙愿已清 提交于 2019-11-29 08:33:37
智能指针的使用栗子(如下定义中,也可以将指针计数维护类增加封装为友元类): // CMySmartPtr指针封装类,将普通指针封装为智能指针 template <class T> class CMySmartPtr { public: /* 构造函数 */ CMySmartPtr(T* pT) { pCountT = new CCountT(pT); } CMySmartPtr() { pCountT = NULL; // 默认指针为空 } /* 复制控制 */ ~CMySmartPtr() { DeleteData(); } CMySmartPtr(const CMySmartPtr& p) { CopyData(p); } CMySmartPtr& operator=(const CMySmartPtr& p) { if (this != &p) // 注意自身对自身赋值的情况 { DeleteData(); CopyData(p); } return *this; } /* 指针*和->解引用 */ T& operator*() { return *(this->pCountT->pT); } T* operator->() { return this->pCountT->pT; } private: // 装饰类,为智能指针维护引用计数、和所管理类型的指针 class

【学习总结】boost智能指针

帅比萌擦擦* 提交于 2019-11-29 06:31:47
一、为什么使用智能指针 为管理内存等资源,C++采取RAII机制(资源获取即初始化,Resource Acquisition Is Initialization),在使用资源的类的构造函数中申请资源并使用,最终在析构函数中释放资源。使用new在堆上创建对象时,其析构函数不会自动调用,需要使用delete才能释放资源,若因为异常导致程序未能执行delete,则存在内存泄露的问题。C++98标准中的“自动指针std::auto_ptr(C++11中废弃,改用unique_ptr)部分解决了获取资源自动释放的问题。 二、boost库提供的智能指针 boost.smart_ptr库提供六种智能指针,包括socped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr和intrusive_ptr。他们都是轻量级的对象,速度与原始指针相差无几,都是异常安全的,而且对于所指向的类型T也仅有一个很小且合理的要求:类型T的析构函数不能抛出异常。 头文件:#include<boost/smart_ptr.hpp> scoped_ptr 保证智能指针只能在本作用域中使用,拥有对象的唯一所有权,不可以复制。如果一个类中有scoped_ptr成员变量,则该类也不可拷贝或赋值。 <boost/scoped_ptr.hpp> scoped_array

详解C++11智能指针

孤街浪徒 提交于 2019-11-29 03:34:57
前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用。 C++11智能指针介绍 智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。只有引用计数为0时,智能指针才会自动释放引用的内存资源。对shared_ptr进行初始化时不能将一个普通指针直接赋值给智能指针,因为一个是指针,一个是类。可以通过make_shared函数或者通过构造函数传入普通指针。并可以通过get函数获得普通指针。 为什么要使用智能指针 智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。 auto_ptr (C++98的方案,C++11已经抛弃

智能指针的简单实现

冷暖自知 提交于 2019-11-29 02:47:05
template <class T> class Sp { public: Sp(T* ptr = nullptr) : ptr_(ptr), count_(new size_t) { if (ptr) { *count_ = 1; } else { *count_ = 0; } } Sp(const Sp& other) { ptr_ = other.ptr_; count_ = other.count_; (*count_)++; } Sp& operator=(const Sp& src) { if (ptr_ == src.ptr_) { return *this; } ReleaseCount(); ptr_ = src.ptr_; count_ = src.count_; (*count_)++; return *this; } size_t use_count() { return *count_; } T& operator*() { if (ptr_) { return *ptr_; } } T* operator->() { if (ptr_) { return ptr_; } } operator bool() const { return ptr_ != nullptr; } ~Sp() { ReleaseCount(); } private: void

Rust中的Rc--引用计数智能指针

旧城冷巷雨未停 提交于 2019-11-29 02:35:14
大部分情况下所有权是非常明确的:可以准确的知道哪个变量拥有某个值。然而,有些情况单个值可能会有多个所有者。例如,在图数据结构中,多个边可能指向相同的结点,而这个结点从概念上讲为所有指向它的边所拥有。结点直到没有任何边指向它之前都不应该被清理。 为了启用多所有权,Rust 有一个叫做 Rc<T> 的类型。其名称为 引用计数( reference counting )的缩写。引用计数意味着记录一个值引用的数量来知晓这个值是否仍在被使用。如果某个值有零个引用,就代表没有任何有效引用并可以被清理。 enum List { Cons(i32, Rc<List>), Nil, } use crate::List::{Cons, Nil}; use std::rc::Rc; fn main() { let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil))))); println!("count after creating a = {}", Rc::strong_count(&a)); let b = Cons(3, Rc::clone(&a)); println!("count after creating b = {}", Rc::strong_count(&a)); { let c = Cons(4, Rc::clone(&a));

Rust自定义智能指针

心已入冬 提交于 2019-11-29 02:32:30
深了,真深了。 use std::ops::Deref; struct MyBox<T>(T); impl<T> MyBox<T> { fn new(x: T) -> MyBox<T> { MyBox(x) } } impl<T> Deref for MyBox<T> { type Target = T; fn deref(&self) -> &T { &self.0 } } fn hello(name: &str) { println!("Hello, {}!", name); } fn main() { let x = 5; let y = MyBox::new(x); assert_eq!(5, x); assert_eq!(5, *y); let m = MyBox::new(String::from("Rust")); hello(&m); } 来源: https://www.cnblogs.com/aguncn/p/11440479.html

C++ 智能指针 (unique_ptr)

主宰稳场 提交于 2019-11-29 01:50:54
在 上一章 中, 我们已经将 n维数组与指针的联系 讲完了, 现在要介绍的是非常高级的 C++ 指针, 指针的内容 必须完全掌握才可进入此篇 , 没有掌握看 此篇 请注意: 部分 IDE (如 Dev-Cpp) 不支持 C++11 或没有 <memory> 头文件者, 请 跳过此篇 在 C++ 官网 中已经详细的介绍了智能指针, 现在来总结一下: 1.智能指针的 访问与操作方式与普通指针一致 2.智能指针可以在作用域结束或突然终止时 自动释放内存 , 无需 delete 声明智能指针, 需要用到: #include <memory> using namespace std; 声明方式有两种, 第一种推荐, 但是 如果不支持请换用第二种 :(括号可省) 1. auto 变量名=make_unique<数据类型>( new 数据类型或写一个 需要指向的变量或构造函数 ) #include <memory> using namespace std; int main() { int x=1; auto ptr=make_unique<int>(x);//将int指针ptr指向x  //无需释放内存, 会自动释放 return 0; } 2. unique_ptr<数据类型> 变量名(new 数据类型或写一个 需要指向的变量或构造函数 ) #include <memory> using