参考https://www.cnblogs.com/lanxuezaipiao/p/4132096.html#top 与c++ primer第五版(p432)
程序使用动态内存的三个原因:
此函数在动态内存中分配一个对象并初始化,返回指向该对象的shared_ptr。
//指向了一个值为42的int的shared_ptr shared_ptr<int> p3 = make_shared<int>42; //传递的参数必须与string的某个构造函数相匹配 shared_ptr<string>p4=make_shared<string>(10,‘9‘);
每一个shared_int都关联一个计数器,称为引用计数。
一旦计数器为0,会自动释放所管理的对象,即shared_ptr的析构函数销毁对象,释放其内存。
auto r = make_shared<int>(42);
r = p; //给r赋值,递减r原来指向对象的引用计数
我们使用的类中,分配的资源与使用的对象的生存周期一致;如下:
vector<int> v1; { vector<int> v2={1,2}; v1=v2; } //v2和它的元素均被销毁; // v1中有三个元素,是v2 的拷贝
但某些类分配的资源与使用的对象的生存周期相互独立。
Blob<string> b1; {//新作用域 Blob<string> b2={"1","1"}; b1=b2; }//b2被销毁,但b2中的元素不能销毁
StrBlob是一个管理string的类,借助标准库容器vector,以及动态内存管理类shared_ptr,我们将vector保存在动态内存里,这样就能在多个对象之间共享内存。
1 #include <vector> 2 #include <string> 3 #include <memory> 4 class StrBlob 5 { 6 public: 7 typedef std::vector<std::string>::size_type size_type; 8 StrBlob(); 9 StrBlob(std::initializer_list<std::string> il); 10 size_type size() const {return data->size();} 11 bool empty() const {return data->empty();}; 12 //添加和删除元素 13 void push_back(const std::string& t) { data->push_back(t);}; 14 void pop_back(); 15 //元素访问 16 std::string& front(); 17 std::string& back(); 18 private: 19 std::shared_ptr<std::vector<std::string>> data; 20 //data[i]不合法时,抛出异常 21 void check(size_type i, const std::string &msg) const; 22 };
1 #include "StrBlob.h" 2 #include <exception> 3 4 StrBlob::StrBlob():data(std::make_shared<std::vector<std::string>>()){} 5 6 StrBlob::StrBlob(std::initializer_list<std::string> il): 7 data(std::make_shared<std::vector<std::string>>(il)){} 8 9 void StrBlob::check(size_type i, const std::string &msg) const 10 { 11 if(i >= data->size()) 12 throw std::out_of_range(msg); 13 } 14 15 std::string& StrBlob::front() 16 { 17 check(0, "front on empty StrBlob"); 18 return data->front(); 19 } 20 21 std::string& StrBlob::back() 22 { 23 check(0, "back on empty StrBlob"); 24 return data->back(); 25 } 26 27 void StrBlob::pop_back() 28 { 29 check(0, "pop_back on empty StrBlob"); 30 return data->pop_back(); 31 }
原文:https://www.cnblogs.com/wsl96/p/13088201.html