一、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对象
shared_ptr管理一组数据,却只new了一个对象
shared_ptr<Int[]> arr_p(new Int(10)); // 删除器调用delete[]
由于用Int[]初始化shared_ptr的模板类型参数,所以删除器使用delete[],delete[]会在_Ptr往前偏移4字节取出数组元素个数,此时会取出fdfdfdfd,然后执行这么多次析构函数
shared_ptr管理一个对象,却使用new[]
shared_ptr<Int> p(new Int[10]); // 删除器调用delete
用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>());
以上写法让shared_ptr对象都管理了vector对象,但是以下写法会报错
shared_ptr<vector<Int>> vec_p;
vec_p->emplace_back(1);
vec_p->size();
因为我们没有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();
}
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)));