shared_ptr管理一组数据,却只new了一个对象 <Int[]>arr_p(newInt(10));// 删除器调用delete[] 1. 由于用Int[]初始化shared_ptr的模板类型参数,所以删除器使用delete[],delete[]会在_Ptr往前偏移4字节取出数组元素个数,此时会取出fdfdfdfd,然后执行这么多次析构函数 shared_ptr管理一个对象,却使用new[] <...
shared_ptr重载了“*”和"->"操作符以模仿原始指针的行为,提供显示bool类型转换以判断指针的有效性,get()可以得到原始指针,并且没有提供指针算术操作,也不能管理new[]产生的动态数组指针 shared_ptr<T>ptr(newT);// T可以是int、char、class等各种类型shared_ptr<std::string>sps(newstd::string("smart"));...
voidprocess(shared_ptr<int>ptr){...}int*x(newint(1024));process(x);//错误,不能将int*转换为一个shared_ptr<int>process(shared_ptr<int>(x)); //合法的,但是process函数返回之后内存会被释放int j=*x; //错误,x所指的内存已经被释放了 八、get函数的使用 shared_prt类的get函数返回一个内置指...
①不要让auto_ptr和shared_ptr指向new[]申请的动态内存(除非为智能指针定义一个删除器)原因:auto_ptr 和shared_ptr 的默认释放内存方式是delete,如果动态对象是以new[] 形式创建的,比如数组,就不要使用auto_ptr和shared_ptr,否则就会导致以delete形式去释放new[]申请的内存一句话概括就是auto_ptr和shared_ptr只能...
shared_ptr<string>p2=make_shared<string>(10,'9'); //p3指向一个值初始化为0的int数 shared_ptr<int>p3=make_shared<int>(); 1. 2. 3. 4. 5. 6. 7. 8. 配合auto使用:make_shared函数可以赋值给auto,这样比较简单 autop=make_shared<vector<string>>(); ...
与unique_ptr的区别 首先最明显的区别自然是它们一个是专享对象,一个是共享对象。而正是由于共享,包括要维护引用计数等,它带来的开销相比于unique_ptr来说要大。另外,shared_ptr无法直接处理数组,因为它使用delete来销毁对象,而对于数组,需要用delete[]。因此,需要指定删除器: ...
与unique_ptr的区别 首先最明显的区别自然是它们一个是专享对象,一个是共享对象。而正是由于共享,包括要维护引用计数等,它带来的开销相比于unique_ptr来说要大。 另外,shared_ptr无法直接处理数组,因为它使用delete来销毁对象,而对于数组,需要用delete[]。因此,需要指定删除器: ...
我们必须将 shared_ptr 显式绑定到一个想要返回的指针上: shared_ptr<int>clone(intp){// 正确:显式地用 int* 创建 shared_ptr<int>returnshared_ptr<int>(newint(p));} 默认情况下,一个用来初始化智能指针的普通指针必须指向动态内存,因为智能指针默认使用 delete 释放它所关联的对象。我们可以将智能指针绑...
shared_ptr和动态数组 std::shared_ptr智能指针是c++11⼀个相当重要的特性,可以极⼤地将开发者从资源申请/释放的繁重劳动中解放出来。然⽽直到c++17前std::shared_ptr都有⼀个严重的限制,那就是它并不⽀持动态数组:#include <memory> std::shared_ptr<int[]> sp1(new int[10]()); // 错误,...
对于申请的动态数组,释放规则可以使用 C++11 标准中提供的 default_delete 模板类,我们也可以自定义释放规则: //指定 default_delete 作为释放规则std::shared_ptr<int> p6(new int[10], std::default_delete<int[]>());//自定义释放规则void deleteInt(int*p) { delete []p;}//初始化智能指针,并自定义...