动态内存之智能指针

来源:互联网 发布:head first java第三版 编辑:程序博客网 时间:2024/06/05 08:03

        一般情况下写的代码中的变量,函数等,他们的周期都是随着程序的结束而销毁,由系统分配,销毁,一般都存在栈中,而在程序中有一些内存是由我们手动释放或者定义,叫做堆。具体内容在:程序中的内存分配。

        一般动态内存的分配饰通过new运算符分配,通过delete来释放,但是有时候会忘记释放,导致内存泄漏,或者有时候还在使用中就释放掉了,这时就会引起非法引用。所以标准库提供了智能指针:[1]shared_ptr:允许多个指针指向同一个对象[2]:unique_ptr:只允许自己一个人指向这个对象。注:堆中的空间没有名字,所以分配的时候返回的是空间。

 1.shared_ptr

  他与vector类似,也是一个模板,所以创建的时候必须声明类型。

shared_ptr<string> a;
默认初始化的指针中保存一个空指针,占内存(8)。

shared_ptr与unique_ptr操作与一般的指针相同,unique有几个不能使用比如‘=’:p和q都是shared_ptr保存的指针必须可以相互转换,会增加p的计数器,减少q的计数器,为0就释放了。

2.make_shared函数

为了更安全的使用智能指针标准库提供了make_sharde函数,也在memory类中。定义方式与模板类相似:

shared_ptr<int> a= make_shared<int>(10);//指向一个10int大小的内存空间shared_ptr<string> a= make_shared<int>(10,'a');//指向值为'aaaaaaaaaaa'的内存shared_ptr<int> a= make_shared<int>();//初始化指针,值为0
他与emplace成员类似,后面的参数必须和string的构造函数相匹配。

用make_shared不用New是因为前者在分配对象的同时就将shared_ptr绑定了,shared_ptr可以协调对象之间的析构,避免了把一块内存绑定到多个独立的shared_ptr上了。
3.指针的释放
智能指针里面后隐藏一个计数器,计着当前几个指针指向他所在内存,没法显示出结果。

shared_ptr<int> a=make_shared<int>(10);shared_ptr<int> b=make_shared<int>(10);b=a;
第一步a指向的内存只有a一个使用的,第二步a指向了b指向的内存所以a的计数器减1,为0,自动释放。最后一个智能指针是通过析构函数释放的。

4.unique_ptr
unique_ptr不需要使用make_shared,需要绑定到一个new返回的指针上,初始化的方式只能使用直接初始化。

unique_ptr<double> p;unique_ptr<double> p1(p);//错误不能拷贝unique_ptr<double> p2;p2=p1;//错误,不能赋值



1 0