【足迹C++primer】39、动态内存与智能指针(3)
/**
* 功能:动态内存与智能指针
* 时间:2014年7月8日15:33:58
* 作者:cutter_point
*/ #include<iostream>
#include<vector>
#include<memory>
#include<string> using namespace std;
/**
智能指针和异常
*/
void f()
{
shared_ptr<int> sp(new int(42)); //分配一个新对象
//这段代码抛出一个异常,且在f中未被捕获
}//在函数结束时shared_ptr自己主动释放内存 /*
函数退出有两种可能,正常处理结束或者发生了异常,不管哪种情况,局部对象都会被销毁
*/ //当发生异常的时候,我们直接管理的内存是不会直接释放的
void fun1()
{
int *ip=new int(42); //动态分配一个新对象
//这段代码抛出一个异常。且在fun1中未被捕获
delete ip; //在退出之前释放内存
} /**
智能指针和哑类
*/
struct destination{}; //表示我们正在连接什么;
struct connection{}; //使用连接所需的信息;
connection connect(destination*){} //打开连接
void disconnect(connection){} //关闭给定的链接
void f(destination &d/* 其它參数 */)
{
//获得一个链接;记住使用完后要关闭它
connection c=connect(&d);
//使用连接
//假设我们在f退出前忘记调用disconnect,就无法关闭c了
} /**
使用我们自己的释放操作
*/
void end_connection(connection *p){disconnect(*p);} void fun2(destination &d/* 其它參数 */)
{
connection c=connect(&d);
shared_ptr<connection> p(&c, end_connection);
//使用连接
//当fun2退出的时候(即使是因为异常退出),connection会被正确关闭
} /**
unique_ptr
*/
//初始化unique_ptr必须採用直接初始化形式
//因为一个unique_ptr拥有它指向的对象。因此unique_ptr不支持普通的拷贝或赋值操作
void fun3()
{
unique_ptr<string> p1(new string("Stegosaurus"));
// unique_ptr<string> p2(p1); //错误:unique_ptr不支持拷贝
unique_ptr<string> p3;
// p3=p2; //错误:unique_ptr不支持赋值
} void fun4()
{
unique_ptr<string> p1(new string("Stegosaurus"));
// unique_ptr<string> p2(p1); //错误:unique_ptr不支持拷贝
// unique_ptr<string> p3;
// p3=p2; //错误:unique_ptr不支持赋值
//将全部权从p1(指向string Stegosaurus)转移给p2 unique_ptr<string> p2(p1.release()); //release将p1置为空
unique_ptr<string> p3(new string("Text"));
//将全部权从p3转移到p2
p2.reset(p3.release()); //reset释放了p2原来指向的内存
} /**
传递unique_ptr參数和返回unique_ptr
*/
//返回一个unique_ptr
unique_ptr<int> clone(int p)
{
//正确:从int*创建一个unique_ptr<int>
return unique_ptr<int>(new int(p));
} //返回一个局部对象拷贝
unique_ptr<int> fun5(int p)
{
unique_ptr<int> ret(new int(p));
//...
return ret;
} /**
向unique_ptr传递删除器
*/ /*
void fun6()
{
//p指向一个类型为objT的对象。并使用一个类型为delT的对象释放objT对象
//他会调用一个fcn的delT类型对象
using objT=int;
using delT=int;
delT fcn;
unique_ptr<objT, delT> p(new objT,fcn);
}
有问题。!! !应该用lambda
*/ /*
void fun7(destination &d /* 其它參数//* )
{
connection *pc;
connection c=connect(&d); //打开连接
//当p被销毁时候。连接将会关闭
unique_ptr<connection, decltype(end_connection)*)
p(&c, end_connection);
//使用连接
//当fun7退出时,即使是异常退出,连接也会正常关闭
}
*/
/**
weak_ptr
*/
//weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个shared_ptr
//管理的对象
//当我们创建一个weak_ptr时,要用一个shared_ptr来初始化它
void fun8()
{
auto p=make_shared<int>(42);
weak_ptr<int> wp(p); //wp弱共享p;p的引用计数未改变
/*
因为对象可能不存在,我们不能使用weak_ptr直接訪问对象,而必须调用lock.
lock返回一个指向共享对象的shared_ptr.
*/
if(shared_ptr<int> np=wp.lock())
{
//假设np不为空则条件成立
//if中,np与p共享对象
}
} /**
核查指针类
*/
/*
通过使用weak_ptr,不会影响一个给定的StrBlob所指向的vector的生存期。
可是,能够阻止用户訪问一个不再存在的vector的企图
*/
//对于訪问一个不存在的元素的尝试。StrBlobPtr抛出一个异常
class StrBlobPtr
{
public:
StrBlobPtr():curr(0) {}
StrBlobPtr(StrBlob &a, size_t sz=0):wptr(a.data),curr(sz){}
string& deref() const;
StrBlobPtr &incr(); //前缀递增
private:
//若检查成功,check返回一个指向vector的shared_ptr
shared_ptr<vector<string>> check(size_t, const string&) const;
//保存一个weak_ptr, 意味着底层vector可能会被销毁
weak_ptr<vector<string>> wptr;
size_t curr; //在数组中的当前位置
}; int main()
{ return 0;
}
PS:不要问我。为什么要这样写,由于我基本吧要写的都写到里面去了,能够看出我是先打好草稿再往上传的,可是有个问题这节确实是有点乱,好多我搞半天就是实现不了,上网查别人也是这样写。但我就是不能搞出来。我不知道是哪根筋没跳对- -,总之先看过再说,以后回头再看的时候应该会知道吧,事实上如今看到从前写的那些认为比較难的。如今看来似乎没那么难了,基本如今非常轻松就能够搞出来,我是不是有点小进步呢!
。
【足迹C++primer】39、动态内存与智能指针(3)的更多相关文章
- 12.动态内存和智能指针、 直接管理内存、shared_ptr和new结合使用
12.动态内存和智能指针 1.智能指针分为两种shared_ptr和unique_ptr,后者独占所指向的对象.智能指针也是模板,使用时要用尖括号指明指向的类型.类似emplace成员,make_sh ...
- C++相关:动态内存和智能指针
前言 在C++中,动态内存的管理是通过运算符new和delete来完成的.但使用动态内存很容易出现问题,因为确保在正确的时间释放内存是及其困难的.有时候我们会忘记内存的的释放,这种情况下就会产生内存泄 ...
- 【C++】动态内存与智能指针
C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...
- c++学习笔记—动态内存与智能指针浅析
我们的程序使用内存包含以下几种: 静态内存用来保存局部static对象.类static数据成员以及定义在任何函数之外的变量,在使用之前分配,在程序结束时销毁. 栈内存用来保存定义在函数内部的非stat ...
- 必须要注意的 C++ 动态内存资源管理(二)——指针对象简单实现
必须要注意的 C++动态内存资源管理(二)——指针对象简单实现 四.拷贝类型的资源 上节我们说过,对于图片类型的资源我们有时候往往采用拷贝(如果对于那种公共图片,可能采用唯一副本,提供 ...
- C++Primer学习——动态内存
静态内存:用来保存static 栈内存:保存非static 智能指针: shared_ptr:允许多个指针指向一个对象 unique_ptr:独占所指对象 weak_ptr:一种弱引用,指向share ...
- 《C++ Primer Plus》16.2 智能指针模板类
智能指针是行为类似于指针的类对象,单这种对象还有其他功能.本节介绍三个可帮助管理动态内存分配的智能指针类.先来看看需要哪些功能以及这些功能是如何实现的.请看下面的函数:void remodel(std ...
- c++ boost库学习二:内存管理->智能指针
写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏.如下所示: int _tmain(int argc, _TCHAR* argv[]) ...
- boost的线程池和内存池 智能指针
内存池为boost自带的 #include <boost/pool/pool.hpp> 或者另外一个开源的库: nedmalloc 一个高效率的库 线程池需要下载另外一个开源库 http: ...
随机推荐
- 第3章 jquery中的事件和动画
一,jquery中的事件 (1).执行时机 $(document).ready()和window.onload方法有相似的功能,但是在执行时机方面有区别,windwo.onload在网页中所有的元素包 ...
- Leetcode 472.连接词
连接词 给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词. 连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的. 示例: 输入: ["cat" ...
- 利用Solr的post工具对核心my_core执行删除操作
<delete> <query>*:*</query> </delete> 将上面代码保存到delete_all.xml文件中,并使用Solr的post ...
- IO Streams:缓冲流
我们迄今为止看到的大多数示例都使用无缓冲的I / O.这意味着每个读或写请求都由底层操作系统直接处理.这使程序效率变得很低,因为每个这样的请求经常触发磁盘访问,网络活动或一些相对昂贵的其他操作. 为了 ...
- JSON的使用_检查JSON工具
json简单说就是javascript中的对象和数组. 1.对象:对象在js中表示为"{}"扩起来的内容,数据结构为 {key:value,key:value,...}的键值对的结 ...
- BZOJ1227 [SDOI2009]虔诚的墓主人 【树状数组】
题目 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地.为 ...
- (转)关于Jackson2.x中com.fasterxml.jackson包的用法
Jackson应该是目前最好的json解析工具了,之前一直用的是org.codehaus.jackson包中的工具,使用的 包是jackson-all-1.9.11.jar. 最近发现Jackson升 ...
- TypeToken获取运行时泛型类型
最近正好使用到了Guava的TypeToken来获取泛型的类型信息 比如,泛型父类需要获取其子类定义的泛型类型时: public abstract class GenericClazz<V> ...
- 【NOIP2016练习】T3 质数 (分块)
题意:共有N盏灯,标号为1到N,有M个标有不同质数的开关,开关可以控制所有标号为其标号倍数的灯,按一次开关,所有其控制的灭着的灯都点亮,所有其控制的亮着的灯将熄灭.现在,宿管可以无限的按所有开关,所有 ...
- codeforces gym 100825 D Rings
这题果然就是个暴力题.... 看每个T的四个方向,有'.',或者在边界上就填1 不然就填四个方向上最小的那个数再加1 然而写wa了几发,有点蠢... #include <bits/stdc++. ...