C++智能指针读书笔记

2020-01-06 14:01:15于海丽

最安全的分配和使用shared_ptr的方法是调用名为make_shared这一标准库函数。此函数在动态内存中分配并初始化它,返回指向此对象的shared_ptr。该函数定义在memory中。

make_shared的定义和shared_ptr相似,必须制定要创建对象的类型,如:
 

  1. // 指向一个值为1的int的shared_ptr  shared_ptr<int> p3 = make_shared<int>)(1); 
  2. // 指向一个值为“www”的string的shared_ptr  shared_ptr<string> p4 = make_shared<string>(3, "w"); 
  3. // 指向一个初始化的int,值为0  shared_ptr<int> p5 = make_shared<int>)(); 
?

也可以使用auto定义对象保存make_shared,可以省去书写shared_ptr的麻烦。

  shared——ptr中有一个关联的指示器,称为引用计数。可以看做一个计数器,每当shared_ptr对象进行拷贝操作,如用一个shared_ptr对象初始化另一个shared_ptr对象、作为函数的实参、作为函数返回值时,引用计数都会递增(视为数值+1)。当赋予shared_ptr新值或者shared_ptr被销毁时,引用计数递减。当引用计数减为0,通过析构函数,shared_ptr自动销毁所管理的对象,释放内存。

  需要注意的是,如果多个对象共享底层数据,当某一对象被销毁,不能单方面销毁底层数据,例如:
 

  1. Blob<string> b1;  { // 新作用域 
  2.   Blob<string> b2 = { "x", "b", "b" };    b1 = b2; 
  3. }  // 当离开局部作用域,b2被销毁,然而b2中的元素xbb并不会被销毁     // b1指向最初由b2创建的元素,即“x”, "b", "b",b1依旧可以它们 
?

  weak_ptr是指向shared_ptr管理的对象的一种智能指针,然而它不控制所指向对象的生存期。将一个weak_ptr绑定在shared_ptr上,不会改变shared_ptr的引用计数,一旦最后一个shared_ptr的指向对象被摧销毁,对象就会被释放,有无weak_ptr并无卵影响。我的理解是,weak_ptr提供了指向shared_ptr底层数据的功能,控制了shared_ptr对底层数据的访问。