shared_ptr 是C共享指针往往应用在动态分配内存的场景下。相较于new操作符的优势在于shared_ptr共享指针可以自动进行动态内存释放而new必须与delete配合使用否则会造成内存泄露。一个好的建议是坚持只使用智能指针就可以避免忘记delete造成的内存泄露避免同一块内存被释放两次的问题。对于一块内存只有在没有任何智能指针指向它的情况下才会自动释放它。shared_ptr还可以作为class的成员以使该class的对象能够共享数据。下面的代码进行了一下简单的实践。#includeiostream#includememory#includeinitializer_list#includevectorusingnamespacestd;classintBlob{friendostreamprintBlob(ostreamos,intBlobblob);public:explicitintBlob(initializer_listintil):data_(make_sharedvectorint(il)){std::cout列表初始化构造函数std::endl;}intBlob():data_(make_sharedvectorint()){std::cout默认构造函数std::endl;}intBlob(constintBlobblob):data_(blob.data_){std::cout拷贝构造函数std::endl;}intBloboperator(constintBlobb2){data_b2.data_;return*this;}~intBlob(){std::cout析构函数std::endl;}voidpush_back(intd);voidprintUseCount(){std::coutshared_ptr used count: data_.use_count()endl;}private:shared_ptrvectorintdata_;};voidintBlob::push_back(intd){data_-push_back(d);}ostreamprintBlob(ostreamos,intBlobblob){osblob data size:blob.data_-size()std::endl;for(autod:*(blob.data_)){osd ;}osstd::endl;}intmain(){intBlob B1{0,1,2,3,4,5,6,7,8,9};{intBlobB2(B1);printBlob(cout,B1);//这里说明友元函数可以访问class的私有成员printBlob(cout,B2);B1.printUseCount();B2.printUseCount();B2.push_back(10);}//出该作用域前B2对象会被析构shared_ptr内部的计数器自动减1因此会看到下面的B1.printUseCount()变成了1B1.printUseCount();printBlob(cout,B1);//B2对data所指的vector进行了push_back虽然这里B2已经被析构了但是B1所用的vector也有了10//可以看出B1和B2确实共享了数据intBlob B3;printBlob(cout,B3);return0;}运行结果列表初始化构造函数 拷贝构造函数 blob data size:10 0 1 2 3 4 5 6 7 8 9 blob data size:10 0 1 2 3 4 5 6 7 8 9 shared_ptr used count: 2 shared_ptr used count: 2 析构函数 shared_ptr used count: 1 blob data size:11 0 1 2 3 4 5 6 7 8 9 10 默认构造函数 blob data size:0 析构函数 析构函数shared_ptr可以使用普通的内置指针进行初始化但是这样做是有风险的。如下int*pnewint(50);shared_ptrintp1_shared(p);shared_ptrintp2_shared(p);shared_ptrintp3_shared(p1_shared);std::coutp1_shared.use_count() p2_shared.use_count() p3_shared.use_count()std::endl;打印结果如下2 1 2实际上p1_shared、p2_shared和p3_shared都指向同一个int对象所以use_count都为3才是正确的。但是如果用一个内置指针单独去初始化不同的shared_ptr则智能指针内部的计数器是感受不到的。因此在释放内存的时候就可能产生悬空指针。p3_shared因为是用p1_shared初始化的所以它和p1_shared的use_count打印为2也就是它们都不知道还有一个p2_shared也指向了同一个内存。因此不要混用普通指针和智能指针。