<Int[]>arr_p(newInt(10));// 删除器调用delete[] 1. 由于用Int[]初始化shared_ptr的模板类型参数,所以删除器使用delete[],delete[]会在_Ptr往前偏移4字节取出数组元素个数,此时会取出fdfdfdfd,然后执行这么多次析构函数 shared_ptr管理一个对象,却使用new[] <Int>p(newInt[10]);// 删除器调用delete ...
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函数返回一个内置指...
std::shared_ptr 也可以用来管理动态分配的数组,但需要注意使用 std::shared_ptr 的数组特化。 #include <iostream> #include <memory> void example() { // 使用 std::shared_ptr 管理动态分配的数组 std::shared_ptr<int[]> ptr(new int[3]{1, 2, 3}); std::cout << "Array: "; for (int ...
①不要让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>>(); ...
对于申请的动态数组,释放规则可以 使用C++11 标准中提供的 default_delete 模板类 可以自定义释放规则 //指定 default_delete 作为释放规则 std::shared_ptr<int> p6(new int[10], std::default_delete<int[]>()); //自定义释放规则 void deleteInt(int*p) { ...
与unique_ptr的区别 首先最明显的区别自然是它们一个是专享对象,一个是共享对象。而正是由于共享,包括要维护引用计数等,它带来的开销相比于unique_ptr来说要大。 另外,shared_ptr无法直接处理数组,因为它使用delete来销毁对象,而对于数组,需要用delete[]。因此,需要指定删除器: ...
虽然不能传递给 process 一个内置指针,但可以传递给它一个(临时的)shared_ptr,这个 shared_ptr 是用一个内置指针显式构造的。但是,这样做很可能会导致错误: int*x=newint(1024);//危险:x 是一个普通指针,不是一个智能指针process(x);// 错误:不能将 int* 转换为一个 shared_ptr<int>process(shared_pt...
; // 错误,c++17前不能传递数组类型作为shared_ptr的模板参数 std::unique_ptr<int[]> up1(new ...