首页 > 其他 > 详细

primer Day4

时间:2017-09-27 23:42:09      阅读:296      评论:0      收藏:0      [点我收藏+]

用new分配一个const 对象必须要初始化

通常情况下new失败了,会抛出一个bad_alloc的异常 我们可以通过改变使用new的方式来组织他抛出异常  这种形式的new成为定位New

int *p1 = new int ; //如果分配失败  会抛出一个bad_alloc的异常

int *p2 = new (nothrow) int; // 如果分配失败,不会抛出异常,返回一个空指针

 

接受指针参数的智能指针的构造函数的explicit的,所以不能将一个内置指针隐式转化为一个智能指针 要用直接初始化的形式

 

share_ptr<int>  p1 = new int(10);//错误 不能隐式转化为智能指针

share_ptr<int> p2(new int(10)) //正确

尽量用make_shared 不用new  若使用get函数的时候,不要对返回的指针进行delete 也不要初始化另一个指针 容易造成double free

 

share_ptr<T> p(q,d)  p被销毁时,执行d删除器 而不是直接delete

unique_ptr 拥有它指向的对象,因此unique_ptr不支持拷贝和赋值操作 必须采用直接初始化方式

不能拷贝和赋值unique_ptr有个例外,就是拷贝将要被销毁的unique_ptr

技术分享

unique_ptr也可以重载一个删除器  unique_ptr<T,decltpye(funtion)*> p(&T,funtion)

 

隐式销毁一个内置指针类型的成员变量不会delete它所指向的对象 比如类离开作用域范围 内置指针类型成员变量隐式销毁 但是指向的对象还可以访问,未删除

构造函数 先初始化成员 再执行函数体 析构函数 先执行函数体 在析构成员   (析构函数本身并不直接销毁成员 成员是在析构函数体之后隐含的析构阶段被销毁的,在

整个对象销毁过程中,析构函数体是作为成员销毁步骤之外的另一部分而进行的)

一个类如果需要析构函数,那么一般都要拷贝赋值和拷贝构造函数,不然用默认的合成构造函数,只是简单的拷贝,比如指针类型的成员,简单的拷贝多次指针,指向

同一个地方,但是对象析构时就会多次析构同一个指针,这个肯定是有问题的。

 

c11的新标准 我们可以通过将拷贝构造函数,拷贝赋值运算符定义为删除的函数来阻止拷贝

删除的函数是一种函数 我们虽然声明了它,但是不能以任何方式使用它struct Nocopy{ Nocopy()=default;Nocopy(const Nocopy&)=delete;NoCopy&operator =(const Nocopy&)=delete};

当类中有不能销毁拷贝赋值的成员时 类的合成拷贝控制成员就被定义为删除的

将类的拷贝构造函数 拷贝赋值运算符声明为私有的,可以组织用户拷贝这个类型的对象,但是友员和成员函数依然可以拷贝,为了阻止友元和成员函数进行拷贝,我们将

这些拷贝控制成员声明成private的,但不定义他们。

 

拷贝赋值 :注意两点 1  如果将一个对象赋给自身,赋值运算能够正常工作 2 大多数赋值运算组合了析构函数和拷贝构造函数的工作

 当你编写一个赋值运算符时 一个好的模式是现将右侧运算对象拷贝到一个局部临时对象中,当拷贝完成后,销毁左侧运算对象的现有成员就是安全的,一旦左侧运算对象

的资源被销毁剩下就是从临时对象拷贝到左侧运算对象的成员中  这样对于成员是指针类型的时候 拷贝赋值需要注意的第一点就可以做到

 

行为像指针的类  构造函数(除拷贝构造)引用计数为1 拷贝构造 引用计数加1  拷贝赋值 左边减一 右边加一    

 

primer Day4

原文:http://www.cnblogs.com/simon-xt/p/7368080.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!