shared_ptr<int> iptr = make_ptr<int>(); // 使用int的默认构造函数,初始化shared_ptr对象的内容 shared_ptr<int> iptr = make_ptr<int>(36); // 使用int的重载构造函数,初始化shared_ptr对象的内容为36
5.shared_ptr的拷贝和赋值
智能指针初始化方式: shared_ptr<int> iptr = make_shared<int>(5); cout << iptr.use_count() << endl; shared_ptr<int> data = make_shared<int>(1); // 初始化方式1:make_shared // shared_ptr<int> data(iptr); 初始化方式2:直接初始化 iptr = data; // 初始化方式3:赋值:智能指针之间相互赋值 cout << *iptr << endl; cout << data.use_count() << endl; 智能指针只能用只能指针来初始化,或者相互赋值;不能用内置类型指针来赋值,可以用内置类型指针直接初始化
例子1: // func返回一个shared_ptr,指向一个动态分配的对象 shared_ptr<foo> func(T arg) { return make_shared<foo>(arg); } foo类,使用T类型参数arg,通过构造函数初始化一块内存,nake_shared函数将该内存地址返回给智能指针shared_ptr,
并作为函数func的返回值,返回一个shared_ptr,可以确保在函数体内申请的动态内存会在恰当的时刻被释放
例子2: void func2(T arg) { shared_ptr<foo> p = make_shared<foo>(arg); // 使用p, 当p离开作用域,它指向的内存会被自动释放 }
例子3: shared_ptr<foo> func3(T arg) { shared_ptr<foo> p = make_shared<foo>(arg); return p; // 使用p,当返回p时,引用计数进行了递增操作,当p离开作用域,它指向的内存会被自动释放 } return语句向此函数的调用者返回一个P的拷贝。拷贝一个shared_ptr会增加所管理的对象的引用计数值;当p销毁时,该内存还有其他使用者,内存就不会被释放
如果忘记了销毁程序不再需要的shared_ptr,程序仍然会正常运行,但是会浪费内存。shared_ptr在无用之后仍然保留的一种可能情况:shared_ptr放在容器中,然后重排了容器,从而不再需要某些元素,在这种情况下,应该erase删除不需要的shared_ptr指针。
前面5提到过shared_ptr的初始化,总结一下: 1.不进行初始化,会自动初始化为一个空指针nullptr shared<类型> 指针名;例如:shared_ptr<int> pi; 2.使用内置类型指针直接初始化 shared_ptr<类型> 指针名(内置类型指针p); 这里的p --> 类型* p = new 类型() shared_ptr<类型> 指针名(new<类型>())// shared_ptr与new结合使用 3.shared_ptr<类型> 指针名(智能指针ptr); // 使用智能指针直接初始化 4.shared_ptr<类型> 指针名 = 智能指针ptr; //智能指针赋值初始化 5.shared_ptr<类型> 指针名 = make_shared<类型>(); // make_shared函数初始化
原文:https://www.cnblogs.com/zhang716921/p/10626709.html