C++Primer读书笔记(十三)

异常处理相关内容总结
auto_ptr类模板:
auto_ptr对象只能保存一个指向对象的指针,并且不能用于指向动态分配的数组,使用auto_ptr对象指向动态分配的数组会导致未定义的运行时行为
1、auto_ptr 可以用于为异常安全进行内存分配

2、auto_ptr可以保存任何类型指针的模板
auto_ptr<int> p(new int(42));
auto_ptr<string> p(new string("tianqi"));

3、因为auto_ptr的复制和赋值操作是具有破坏性的,所以不能将之存储在标准容器中。标准容器库的容器类要求在复制和赋值的之后两个对象相等,auto_ptr不满足这一要求。如果ap2赋给ap1,则赋值之后ap1 != ap2

4、auto_ptr的默认构造函数
如果不给定初始式,auto_ptr对象是未绑定的,它不指向任何对象。
auto_ptr<int> p_auto;
默认情况下,auto_ptr的内部指针值置为0,对未绑定的auto_ptr对象解引用,其效果与未绑定的指针解引用相同。
*p_auto = 1024;

5、测试auto_ptr对象
//error:cannot use an auto_ptr as a condition
if(p_auto)
   *p_auto = 1024;
//revised test guarantee p_auto an object
if(p_auto.get())
   *p_auto = 1024;
ps:应该只用get询问auto_ptr对象或者使用返回的指针值,不能用get作为创建其他auto_ptr对象的实参
  使用get成员初始化其他auto_ptr对象违反auto_ptr类设计原则:在任意时刻只有一个auto_ptr对象保存给定指针,如果两个auto_ptr对象保存相同的指针,该指针就会被delete两次。

6、auto_ptr对象与内置指针的另一区别是,不能直接将一个地址赋给auto_ptr对象:
p_auto = new int(42);
相反必须用reset函数来该改变指针:
if (p_auto.get())
{
*p_auto = 1024;
}
else
{
p_auto.reset(new int(1024));
}

auto_ptr类模板为处理动态分配的内存提供了安全性和便利性的尺度。但是使用auto_ptr存在以下限制:
1、不要使用auto_ptr对象保存静态分配对象的指针,否则当auto_ptr对象本身被撤销的时候,它将试图删除指向非动态分配对象的指针,导致未定义行为。
2、永远不要使用两个auto_ptr对象指向同一个对象,导致这个错误的一种明显的方式是,使用同一个指针来初始化或者reser两个不同的auto_ptr对象,另一种导致这个错误的微妙方式可能是,使用一个auto_ptr对象的get函数的结果来初始化或者reset另一个auto_ ptr对象
3、不要使用auto_pttr对象保存指向动态分配数组的指针,当auto_ptr对象被删除的时候,它只释放一个对象--它使用普通delete操作符,而不同数组的delete【】操作符。
4、不要将auto_ptr对象存储在容器中,因为auto_ptr赋值和复制操作具有破
坏性

你可能感兴趣的:(C++,String,测试,读书,delete,存储)