• C++11智能指针shared_ptr管理动态数组和STL容器


    一、shared_ptr管理动态数组

    	shared_ptr<Int> p1(new Int(10));
    	shared_ptr<Int> p2 = make_shared<Int>(10);     // Int对象值为10
    
    	shared_ptr<Int[]> arr_p1(new Int[10]);
    	shared_ptr<Int[]> arr_p2 = make_shared<Int[]>(10); // 10个Int对象
    
    • 1
    • 2
    • 3
    • 4
    • 5

    shared_ptr管理一组数据,却只new了一个对象

    	shared_ptr<Int[]> arr_p(new Int(10)); // 删除器调用delete[]
    
    • 1

    在这里插入图片描述

    在这里插入图片描述
    由于用Int[]初始化shared_ptr的模板类型参数,所以删除器使用delete[],delete[]会在_Ptr往前偏移4字节取出数组元素个数,此时会取出fdfdfdfd,然后执行这么多次析构函数

    在这里插入图片描述
    shared_ptr管理一个对象,却使用new[]

    	shared_ptr<Int> p(new Int[10]);       // 删除器调用delete
    
    • 1

    在这里插入图片描述
    用new[]分配的空间,会有4字节存放元素的个数,然后外围才是越界标记。由于使用delete释放空间,就不会查看4字节的元素个数,而把蓝色的4字节空间作为上越界信息,把灰色的越界信息当作头部信息,把fd当成头部信息就会出错了

    在这里插入图片描述

    一般我们不用shared_ptr管理数组,因为我们使用的时候,无法从shared_ptr对象获取数组的长度,很容易越界,且使用不方便

    二、shared_ptr管理vector

    一般我们可以用shared_ptr管理vector对象

    	shared_ptr<vector<Int>> vec_p1 = make_shared<vector<Int>>();
    	shared_ptr<vector<Int>> vec_p2(new vector<Int>());
    
    • 1
    • 2

    以上写法让shared_ptr对象都管理了vector对象,但是以下写法会报错

    	shared_ptr<vector<Int>> vec_p;
    	vec_p->emplace_back(1);
    	vec_p->size();
    
    • 1
    • 2
    • 3

    因为我们没有new出vector对象给vec_p管理,此时vec_p底层的_Ptr还是nullptr,并没有指向vector对象,自然无法插入数据

    shared_ptr管理vector

    	shared_ptr<vector<Int>> vec_p = make_shared<vector<Int>>();
    	if (vec_p)  // vec_p.opertor bool() 
    	{
    		vec_p->emplace_back(10);
    		vec_p->emplace_back(20);
    		int n = vec_p->size();
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    vector管理shared_ptr

    	vector<shared_ptr<Int>> vec;
    	vec.emplace_back(make_shared<Int>(10));
    	vec.emplace_back(make_shared<Int>(20));
    	vec.emplace_back(shared_ptr<Int>(new Int(20)));
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

  • 相关阅读:
    初级C语言之【函数】
    【编译原理】语义分析
    利用Git+GitHub进行团队协作开发
    C语言每日一题(61)盛最多水的容器
    SDK广告整合
    获取真实IP总结
    两段锁协议
    Python+locust性能测试(一),进军高阶测试......
    运筹说 第73期 | 图论创始人“数学之王”一 欧拉
    5G车载网关让医院无人配送车“灵活“起来
  • 原文地址:https://blog.csdn.net/qq_42500831/article/details/126732453