智能指针

智能指针类模板

老子叫甜甜 提交于 2020-02-14 01:48:24
文章目录 1 智能指针介绍 1.1 智能指针的意义 1.2 STL中的智能指针 1.3 Qt中的智能指针 2 创建智能指针类模板 1 智能指针介绍 1.1 智能指针的意义 智能指针具有如下意义: 现代C++开发库中最重要的类模板之一。 C++中自动内存管理的主要手段。 能够很大程度上避开内存相关的问题。 1.2 STL中的智能指针 STL中的智能指针auto_ptr: 生命周期结束时,销毁指向的内存空间。 不能指向堆数组,只能指向堆对象(变量)。 一片堆空间只属于一个智能指针对象。 多个智能指针对象不能指向同一片堆空间。 编程实验:auto_ptr使用初探 # include <iostream> # include <string> # include <memory> using namespace std ; class Test { string m_name ; public : Test ( const char * name ) { cout << "Hello, " << name << "." << endl ; m_name = name ; } void print ( ) { cout << "I'm " << m_name << "." << endl ; } ~ Test ( ) { cout << "Goodbye, " << m_name << ".

c++之智能指针,异常处理,枚举

拈花ヽ惹草 提交于 2020-02-13 11:15:32
智能指针,文件IO 二、智能指针&动态内存 1. 指针潜在问题 c++ 把内存的控制权对程序员开放,让程序显式的控制内存,这样能够快速的定位到占用的内存,完成释放的工作。但是此举经常会引发一些问题,比如忘记释放内存。由于内存没有得到及时的回收、重复利用,所以在一些c++程序中,常会遇到程序突然退出、占用内存越来越多,最后不得不选择重启来恢复。造成这些现象的原因可以归纳为下面几种情况: 野指针: 内存已经被释放、但是指针仍然指向它。这时内存有可能被系统重新分配给程序使用,从而会导致无法估计的错误 重复释放:程序试图释放已经释放过的内存,或者释放已经被重新分配过的内存,就会导致重复释放错误. 内存泄漏: 不再使用的内存,并没有释放,或者忘记释放,导致内存没有得到回收利用。 忘记调用delete 随着多线程程序的广泛使用,为了避免出现上述问题,c++提供了智能指针,并且c++11对c++98版本的智能指针进行了修改,以应对实际的应用需求。 2. 智能指针 在98版本提供的 auto_ptr 在 c++11得到删除,原因是拷贝是返回左值、不能调用delete[] 等。 c++11标准改用 unique_ptr | shared_ptr | weak_ptr 等指针来自动回收堆中分配的内存。智能指针的用法和原始指针用法一样,只是它多了些释放回收的机制罢了。 智能指针位于 头文件中

C/C++ C++11智能指针

*爱你&永不变心* 提交于 2020-02-12 12:21:12
在使用基本指针类型时,因为要手动释放指针指向的内存,常常容易造成内存泄漏,特别是异常分支很多的情况下。而智能指针类型就是将基本指针类型封装成模板类,以便更好地管理内存。 智能指针都包含一个explicit构造函数,因此基本指针类型不能隐式转换成智能指针,需要显式调用。 shared_ptr<double> sp_d; double *p_d = new double; sp_d = p_d; // 错误,隐式转换。 sp_d = shared_ptr<double>(p_d); // 正确,显式转换。 shared_ptr<double> sp_d = p_d; // 错误,隐式转换。 shared_ptr<double> sp_d(p_d); // 正确,显式转换。 1、auto_ptr 1)由C++98提出,C++11中已经弃用。 std::auto_ptr<int> sp_i1(new int); *sp_i1 = 10; std::auto_ptr<int> sp_i2 = sp_i1; // 所有权转给sp_i2,sp_i1变成空指针 std::cout << *sp_i1 << std::endl; // 运行崩溃 2、shared_ptr 3、weak_ptr 4、unique_ptr 引用计数 循环引用 /*--> */ /*--> */ 来源: https:/

C++中的智能指针

走远了吗. 提交于 2020-02-11 00:09:44
C++中的智能指针 C++ 中的四个智能指针分别是 1.shared_ptr 2.unique_ptr 3.weak_ptr 4.auto_ptr(已经被c++11弃用)(在c++11的环境中会爆警告warning: 'auto_ptr' is deprecated) 智能指针的作用 智能指针的作用是管理一个指针。 因为存在以下这种情况: 申请的空间在函数结束时忘记释放,造成内存泄漏。 使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个 类 ,当超出了类的作用域是,类会自动调用 析构函数 , 析构函数 会自动释放资源。所以智能指针的作用原理就是在 函数结束时自动释放内存空间 ,不需要手动释放内存空间。 所以智能指针的设计思想简单的来说就是: 将基本类型指针封装成类(模板类)对象指针,并且在析构函数里编写delete语句删除指针所指向的内存空间 智能指针的使用 智能指针所在的头文件:#include 智能指针都有一个explicit构造函数(显式构造函数) templet<class T> class auto_ptr{ explicit auto_ptr(X* p=0); } 所以智能指针的调用都只能显示调用 eg: #include<bits/stdc++.h> using namespace std; int main(){ shared_ptr<double>

堆栈里的悄悄话——智能指针

折月煮酒 提交于 2020-02-08 16:44:19
栈里的对象 "构造完毕,请睁开眼吧!",迷迷糊糊中,听着这个声音,我睁开了眼睛,一位小哥映入眼帘。 “你是谁?我是谁?这又是什么地方?”,我的大脑一片空白。 “你是一个C++对象,这里是栈空间。我是创建你的线程,你先待着,一会儿会用到你,拜~” “唉,等一下...”,还没等我回过神,小哥已经走远。 环顾四周,这个叫栈的地方,有好多好多的对象,大小不一,不远处还有一个巨无霸对象足足有好几千字节。 “哇!好大一个对象!”,我不禁发出了惊叹。 “一看就是没见过世面的,这才多小的个头,就在那大呼小叫的”,突然传来一个声音。 “谁在说话?”,我四处望去,却没发现动静。 “往哪看呢,没那么远,就在你旁边”,我这才注意到眼皮底下有个小个子在说话。 “你才8个字节的对象,好大的口气!” “唉,纠正一下,我可不是对象哦,我只是一个指针,我指向的对象那才叫大呢!” 原来这小个子是个指针,顺着他指向的地址望去,果然有一庞然大物,虽不见其全身,估摸着至少也有几MB的大小。 “唉,你指向的对象为何不和我们在一块儿,我看那地方好像不属于栈的地界儿了”。 “说你没见过世面,你还不承认。咱们这栈空间有限,哪里装得下那么多大对象,他们那里叫 堆区 ,一般有身份的对象都放在那边的。那里的对象都是通过new关键字生成的,你们可没这待遇哦,还有...” “嘘!先别说话,你看线程小哥在干嘛?”,看到之前的小哥去了堆区

C++ 智能指针

陌路散爱 提交于 2020-02-07 20:52:42
4个智能指针, auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是C++11支持的,第一个已经被11弃用 auto_ptr, 采用所有权模式,such as: auto_ptr p1 ( new string ( "nice to meet you" ) ) ; auto_ptr p2 ; p2 = p1 ; //it's ok //但是当程序访问p1时程序会报错,所以存在内存崩溃问题 unique_ptr: 保证同一时间直能有一个智能指针指向该对象。 unique_ptr < string > p1 ( new string ( "nice to meet you" ) ) ; unique_ptr < string > p2 = p1 ; //#1 此时会报错 //此外unique还有一个地方。当程序将一个临时右值赋给一个unique_ptr时,编译器允许这么做 //如果你真的想上面#1处的操作,你可以使用标准库函数std::move(unique<T> t); unique_ptr < string > p1 ( new string ( "nice to meet you" ) ) ; unique_ptr < string > p2 = std :: move ( p1 ) ; //#2 allowed /

C++11智能指针

萝らか妹 提交于 2020-02-07 04:17:56
C++11智能指针 为什么要使用智能指针: 智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。 1.auto_ptr (c++98的方案,cpp11已经抛弃) 采用所有权模式 auto_ptr< string> p1 (new string ("I reigned lonely as a cloud.”)); auto_ptr<string> p2; p2 = p1; //auto_ptr不会报错. 此时不会报错,p2剥夺了p1的所有权,但是当程序运行时访问p1将会报错。所以auto_ptr的缺点是:存在潜在的内存崩溃问题! 2.unique_ptr(替换auto_ptr) unique_ptr实现独占式拥有或严格拥有概念, 保证同一时间内只有一个智能指针可以指向该对象 。它对于避免资源泄露(例如“以new创建对象后因为发生异常而忘记调用delete”)特别有用 采用所有权模式,还是上面那个例子 unique_ptr<string> p3 (new string ("auto")); //#4 unique_ptr

C++11 智能指针

社会主义新天地 提交于 2020-01-31 23:14:43
【1】C++11智能指针 应用示例如下: 1 #include <iostream> 2 #include <memory> 3 using namespace std; 4 5 void test_unique_ptr() 6 { 7 unique_ptr<int> up1(new int(2020)); // 无法复制的unique_ptr 8 // unique_ptr<int> up2 = up1; // 不能通过编译 9 cout << (*up1) << endl; // 2020 10 unique_ptr<int> up3 = move(up1); // 现在up3是数据唯一的unique_ptr智能指针 11 cout << (*up3) << endl; // 2020 12 // cout << (*up1) << endl; // 运行时错误 13 up3.reset(); // 显式释放内存 14 up1.reset(); // 不会导致运行时错误 15 // cout << (*up3) << endl; // 运行时错误 16 } 17 18 void test_shared_ptr() 19 { 20 shared_ptr<int> sp1(new int(131)); 21 shared_ptr<int> sp2 = sp1; 22 cout <<

c++:智能指针shared_ptr

好久不见. 提交于 2020-01-31 05:44:54
先前的文章我们讲过了智能指针的概念等一系列问题,下面我们直接来看智能指针 1.带有引用计数的智能指针 (Shared_ptr)同时也是强智能指针 所谓的引用计数,就是有多少个智能指针对象管理这个堆内存。引用计数的作用是做所有对象共享的。 不可以写为普通的成员变量,要写成静态的成员变量 我们用一个引用计数管理器来实现Shared_ptr智能指针: 设计思路: 将引用计数管理器设计为数组,用地址和引用计数来当作节点记录堆内存,因为对地址只做一个简单的计数管理,所以用void*,引用计数用int,在智能指针类中,给出一个私有的成员变量mptr,一个静态的成员变量(引用计数管理器)static RefManage。给定一个对象rm。 但智能指针与引用计数管理器属于两种不同的类,为了实现它们之间的信息交互就要调用对方的接口。在引用计数管理器中预留一些接口(下面会给出接口的类型),注意堆上的操作都在智能指针类,通过下面的几个接口可以来进行对 智能指针类的操作,智能指针类中成员变量,静态变量已经设置好。智能指针类构造函数中,引用计数初值都是零,现在 添加 一个引用计数,现在生成一个sp1对象,要调用构造函数对sp1进行初始化,将mptr传给地址域,mptr地址为0x100,通过 getRef()接口传递到引用计数管理器类中,要将0x100与地址域中的数据做比较,如查到与0x100相等的数据

智能指针 unique_ptr

£可爱£侵袭症+ 提交于 2020-01-30 02:28:57
定义 unique_ptr 是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,独享被管理对象指针所有权的智能指针。 int main() { std::unique_ptr<int> num(new int(23)); cout << *num << endl; return 0; } move和get std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝所以可以提高利用效率,改善性能.。 get函数会返回存储的指针。如果由unique_ptr不为空,则存储的指针指向由unique_ptr管理的对象,否则指向nullptr。 #include<string> #include<cstring> #include<iostream> #include<queue> #include<map> #include<algorithm> #include<memory> using namespace std; int main() { unique_ptr<int> num(new int(23)); cout<<"value="<<*num<<" "<<" addr="<<num.get()<<endl; unique_ptr<int> num1=move(num); cout<<"value="<<*num1<<"