#include <memory>
#include <iostream>
// shared_ptr实现共享式拥有概念。
// 多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。
// 从名字share就可以看出了资源可以被多个指针共享,它使用计数机制来表明资源被几个指针共享。
// share_ptr智能指针还是有内存泄露的情况:
// 当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄漏。
int main() {
std::cout << "***********************默认初始化为空***********************" << std::endl;
std::shared_ptr<std::string> e1;
std::shared_ptr<std::string> e2(nullptr);
std::shared_ptr<std::string> e3(new std::string);
std::cout << "e1 is :" << (e1 ? "not empty" : "empty") << std::endl;
std::cout << "e2 is :" << (e2 ? "not empty" : "empty") << std::endl;
std::cout << "e3 is :" << (e3 ? "not empty" : "empty") << std::endl;
std::cout << "***********************使用*或者->访问数据***********************" << std::endl;
std::shared_ptr<std::string> u1(new std::string("test"));
std::shared_ptr<std::string> u2(new std::string("test"));
std::cout << "*u1 : " << *u1 << std::endl;
std::cout << "u2->c_str(): " << u2->c_str() << std::endl;
std::cout << "***********************使用=获取数据的所有权,共享***********************" << std::endl;
std::shared_ptr<int> share1(new int(10));
std::shared_ptr<int> share2 = share1;
std::cout << "share1:" << *share1 << std::endl;
std::cout << "share2:" << *share2 << std::endl;
std::cout << "***********************通过use_count函数查看当前资源被多少个指针引用***********************" << std::endl;
std::string* str = new std::string("123");
std::shared_ptr<std::string> c1(str);
std::cout << "usercount:" << c1.use_count() << std::endl;
std::shared_ptr<std::string> c2 = c1;
std::cout << "usercount:" << c1.use_count() << std::endl;
std::shared_ptr<std::string> c3 = c2;
std::cout << "usercount:" << c1.use_count() << std::endl;
// 避免这种用法,不可以将一个资源同时交给多个shared_ptr管理,因为多个share_ptr是隔离的,所以会导致shared_ptr被析构多次
/*std::string* str1 = new std::string("t");
std::shared_ptr<std::string> s3(str1);
std::cout << s3.use_count() << std::endl;
std::shared_ptr<std::string> s4(str1);
std::cout << s3.use_count() << std::endl;
*/
std::cout << "*******通过reset释放原有资源的所有权(原资源引用计数为0时会被释放),获取新的资源所有权*******" << std::endl;
std::shared_ptr<int> res1(new int(10));
std::shared_ptr<int> res2(res1);
std::cout << "before reset. res1 use_count:" << res1.use_count() << std::endl;
std::cout << "before reset. res2 use_count:" << res2.use_count() << std::endl;
// 释放原有资源的控制权,获取新资源的所有权
res1.reset(new int(20));
std::cout << "after reset. res1 use_count:" << res1.use_count() << std::endl;
std::cout << "after reset. res2 use_count:" << res2.use_count() << std::endl;
// 注意reset不允许reset(nullptr),直接使用reset即可
// res1.reset(nullptr); // 报错
res1.reset();
std::cout << "after res1.reset(),res1.get(): " << res1.get() << std::endl;
std::cout << "***********************使用get方法获取原始指针***********************" << std::endl;
std::shared_ptr<int> g1(new int(10));
int* iptr = g1.get();
std::cout << "*iptr:" << *iptr << std::endl;
std::cout << "g1.use_count():" << g1.use_count() << std::endl;
std::cout << "***********************使用swap(成员函数和标准库函数都可以)交换两个指针的所有权***********************" << std::endl;
std::shared_ptr<int> swa1(new int(10));
std::shared_ptr<int> swa2 = swa1;
std::shared_ptr<int> swa3 = swa1;
std::shared_ptr<int> swb(new int(20));
std::cout << "before swap. swa3.use_count():" << swa3.use_count() << std::endl;
std::cout << "before swap. *swa3:" << *swa3 << std::endl;
std::cout << "before swap. swb.use_count():" << swb.use_count() << std::endl;
std::cout << "before swap. *swb:" << (*swb) << std::endl;
swb.swap(swa3);
std::cout << "after swap. swa3.use_count():" << swa3.use_count() << std::endl;
std::cout << "after swap. *swa3:" << *swa3 << std::endl;
std::cout << "after swap. swb.use_count():" << swb.use_count() << std::endl;
std::cout << "after swap. *swb:" << (*swb) << std::endl;
// 使用标准库函数再次进行交换
std::swap(swa3, swb);
std::cout << "after swap std::swap. swa3.use_count():" << swa3.use_count() << std::endl;
std::cout << "after swap std::swap. *swa3:" << *swa3 << std::endl;
std::cout << "after swap std::swap. swb.use_count():" << swb.use_count() << std::endl;
std::cout << "after swap std::swap. *swb:" << (*swb) << std::endl;
std::cout << "****通过unique函数判断当前指针是否与其他指针共享资源,当且仅当当前指针指向一个没有被别人指向的资源才返回true****" << std::endl;
std::shared_ptr<int> un1;
std::shared_ptr<int> un2(new int);
std::cout << "uniq1.unique():" << un1.unique() << std::endl;
un1 = un2;
std::cout << "uniq1.unique():" << un1.unique() << std::endl;
un2 = nullptr;
std::cout << "uniq1.unique():" << un1.unique() << std::endl;
std::cout << "*************使用make_shared函数创建一个共享指针" << std::endl;
std::shared_ptr<int> m1 = std::make_shared<int>(10);
// 上述做法效果等同于:
std::shared_ptr<int> m2(new int(10));
std::cout << "*m1:" << *m1 << std::endl;
std::cout << "*m2:" << *m2 << std::endl;
}
使用示例方式记录shared_ptr使用方法
最新推荐文章于 2025-01-21 16:52:50 发布