用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 拷贝赋值 左边减一 右边加一