科技公司网站欣赏,公司图标设计大全免费 logo,宿州北京网站建设,装宽带多少钱一个月使用智能指针需要添加头文件:
代码如下:
#include memoryshared_ptr使用的注意事项: 1.不能使用一个原始地址初始化多个共享智能指针 2.函数不能返回管理了this的共享智能指针对象 3.共享智能指针不能循环引用
初始化:
1.通过构造函数初始化
代码如下:
std::shar…使用智能指针需要添加头文件:
代码如下:
#include memoryshared_ptr使用的注意事项: 1.不能使用一个原始地址初始化多个共享智能指针 2.函数不能返回管理了this的共享智能指针对象 3.共享智能指针不能循环引用
初始化:
1.通过构造函数初始化
代码如下:
std::shared_ptrT 智能指针名字(创建堆内存)2.通过拷贝和移动构造函数初始化
代码如下:
#include iostream
#include memory
using namespace std;int main()
{// 使用智能指针管理一块 int 型的堆内存, 内部引用计数为 1shared_ptrint ptr1(new int(520));cout ptr1管理的内存引用计数: ptr1.use_count() endl;//调用拷贝构造函数shared_ptrint ptr2(ptr1);cout ptr2管理的内存引用计数: ptr2.use_count() endl;shared_ptrint ptr3 ptr1;cout ptr3管理的内存引用计数: ptr3.use_count() endl;//调用移动构造函数shared_ptrint ptr4(std::move(ptr1));cout ptr4管理的内存引用计数: ptr4.use_count() endl;std::shared_ptrint ptr5 std::move(ptr2);cout ptr5管理的内存引用计数: ptr5.use_count() endl;return 0;
}/*作者: 苏丙榅
链接: https://subingwen.cn/cpp/shared_ptr/#1-2-%E9%80%9A%E8%BF%87%E6%8B%B7%E8%B4%9D%E5%92%8C%E7%A7%BB%E5%8A%A8%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E5%88%9D%E5%A7%8B%E5%8C%96
来源: 爱编程的大丙*/3.通过std::make_shared初始化
代码如下:
通过 C 提供的 std::make_shared() 就可以完成内存对象的创建并将其初始化给智能指针函数原型如下
templatetypename T,typename ...Args
shared_ptrTmake_shared(Args...args);T模板参数的数据类型Args… args 要初始化的数据如果是通过 make_shared 创建对象需按照构造函数的参数列表指定
4.通过reset方法初始化
共享智能指针类提供的 std::shared_ptr::reset 方法函数原型如下
void reset() noexcept;template class Y
void reset( Y* ptr );template class Y, class Deleter
void reset( Y* ptr, Deleter d );template class Y, class Deleter, class Alloc
void reset( Y* ptr, Deleter d, Alloc alloc );/*作者: 苏丙榅
链接: https://subingwen.cn/cpp/shared_ptr/#1-3-%E9%80%9A%E8%BF%87std-make-shared%E5%88%9D%E5%A7%8B%E5%8C%96
来源: 爱编程的大丙*/ptr指向要取得所有权的对象的指针d指向要取得所有权的对象的指针aloc内部存储所用的分配器
reset两个功能:
1.让指向某块内存的智能指针解除对这片内存的管理
2.通过reset调用让一个指向某块内存的智能指针指向另块一块内存也就是让它去管理另外一块内存。
两个函数:
如果想要查看当前有多少个智能指针同时管理着这块内存可以使用共享智能指针提供的一个成员函数 use_count函数原型如下
// 管理当前对象的 shared_ptr 实例数量或若无被管理对象则为 0。
long use_count() const noexcept;获取原始指针
对应基础数据类型来说通过操作智能指针和操作智能指针管理的内存效果是一样的可以直接完成数据的读写。但是如果共享智能指针管理的是一个对象那么就需要取出原始内存的地址再操作可以调用共享智能指针类提供的 get () 方法得到原始地址其函数原型如下
T* get() const noexcept;代码如下:
#include iostream
#include memory
#include string
using namespace std;class Test
{
public:Test(){cout construct endl;}Test(int x) :m_num(x){cout construct x x endl;}Test(string str){cout construct str str endl;}~Test(){cout destruct endl;}void setValue(int v){m_num v;}void print(){cout m_num m_num endl;}private:int m_num;
};int main()
{//通过构造函数初始化shared_ptrintptr1(new int(3));cout ptr1 use_count ptr1.use_count() endl;//通过移动构造和拷贝构造函数初始化shared_ptrintptr2 move(ptr1);cout ptr1 use_count ptr1.use_count() endl;cout ptr2 use_count ptr2.use_count() endl;shared_ptrintptr3 ptr2;cout ptr3 use_count ptr3.use_count() endl;cout ptr2 use_count ptr2.use_count() endl;//通过std::make_shared初始化shared_ptrintptr4 make_sharedint(8);shared_ptrTestptr5 make_sharedTest(8);cout ptr5 use_count ptr5.use_count() endl;shared_ptrTestptr6 make_sharedTest(hello);cout ptr6 use_count ptr6.use_count() endl;//通过reset初始化ptr6.reset();cout ptr6 use_count ptr6.use_count() endl;ptr5.reset(new Test(world));cout ptr5 use_count ptr5.use_count() endl;return 0;
}测试结果: shared_ptr的使用:
代码如下:
#include iostream
#include memory
#include string
using namespace std;class Test
{
public:Test(){cout construct endl;}Test(int x) :m_num(x){cout construct x x endl;}Test(string str){cout construct str str endl;}~Test(){cout destruct endl;}void setValue(int v){m_num v;}void print(){cout m_num m_num endl;}private:int m_num;
};int main()
{//通过构造函数初始化shared_ptrintptr1(new int(3));cout ptr1 use_count ptr1.use_count() endl;//通过移动构造和拷贝构造函数初始化shared_ptrintptr2 move(ptr1);cout ptr1 use_count ptr1.use_count() endl;cout ptr2 use_count ptr2.use_count() endl;shared_ptrintptr3 ptr2;cout ptr3 use_count ptr3.use_count() endl;cout ptr2 use_count ptr2.use_count() endl;//通过std::make_shared初始化shared_ptrintptr4 make_sharedint(8);shared_ptrTestptr5 make_sharedTest(8);cout ptr5 use_count ptr5.use_count() endl;shared_ptrTestptr6 make_sharedTest(hello);cout ptr6 use_count ptr6.use_count() endl;//通过reset初始化ptr6.reset();cout ptr6 use_count ptr6.use_count() endl;ptr5.reset(new Test(world));cout ptr5 use_count ptr5.use_count() endl;//获取原始指针Test *t ptr5.get();t-setValue(1000);t-print();//直接使用ptr5-setValue(999);ptr5-print();return 0;
}