0
点赞
收藏
分享

微信扫一扫

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


文章目录

  • ​​一、shared_ptr管理动态数组​​
  • ​​二、shared_ptr管理vector​​

一、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对象

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

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

C++11智能指针shared_ptr管理动态数组和STL容器_数据结构

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


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

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


shared_ptr管理一个对象,却使用new[]

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

C++11智能指针shared_ptr管理动态数组和STL容器_数据结构_04


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

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

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

二、shared_ptr管理vector

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

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

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

<vector<Int>> vec_p;
vec_p->emplace_back(1);
vec_p->size();

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

shared_ptr管理vector

<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();
}

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

vector管理shared_ptr

<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)));

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


举报

相关推荐

0 条评论