首页电脑使用C++智能指针指向new对象 c++智能指针是线程安全的吗

C++智能指针指向new对象 c++智能指针是线程安全的吗

圆圆2025-08-22 12:01:13次浏览条评论

shared_ptr默认用delete和delete

在C中使用std::shared_ptr登录后复制管理数据库时,需要注意默认的删除器(deleter)会调用delete登录后复制而不是delete[]登录后复制登录后复制登录后复制,这会导致未定义行为。因此,正确管理动态分配的数据库需要显式指定删除器或使用其他方式。问题:shared_ptr默认不支持数据库删除

当你这样写:std::shared_ptr ptr(new int[10]);

解析结构时会调用delete ptr.get()登录后复制,而不是delete[]登录后复制登录后复制,造成内存溢出或立即崩溃。解决方案一:指定自定义删除器

通过lambda或函数对象指定delete[]登录后复制登录后复制登录后复制作为复制删除器:

学习“C 自由学习笔记(研究)”;std::shared_ptr arr(new int[5], [](int* p) { delete[] p; });

现在阵列能正确释放。可以安全地复制arr登录后复制,引用自动统计管理。

示例示例:auto array = std::shared_ptr(new int[3], std::default_delete());array[0] = 1; //注意:shared_ptr不重载operator引用[],需手动解*(array.get() 1) = 2;解决方案二:使用std::make\_shared(C 20起支持阵列)

C 20开始,std::make_shared登录后复制支持备份:auto arr = std::make_shared(10); //10个int的磁盘阵列[0] = 42;

注意:只能用于默认初始化的备份。要指定大小并初始化,可结合自定义删除器使用new登录后复制表达式。替代方案:优先std::vector

大多数情况下,std::vector登录后复制是更好的选择:std::vector vec(10);std::shared_ptrgt;ptr = std::make_sharedgt;(10);

矢量登录后复制登录后复制自带动态大小、越界检查(可选)、自动内存管理,且与STL兼容性好。只有在需要共享语音且必须使用裸队列时才用shared_ptrlt;T[]gt;登访问元素的方法

由于shared_ptr登录后复制登录后复制没有重载operator[]登录后复制,访问备份元素需要:使用get()登录后复制获取原始指针:arr.get()[i]登录后复制或手动偏移:*(arr.get() i) 登录后复制

基本上就这些。只记得指定删除器或者用C 20的make_shared登录后复制,可以安全地使用shared_ptr登录后复制登录后复制管理阵列。但大多数场景下,向量登录后复制登录后复制更简单可靠。

以上就是C智能管道读取shared_ptr数据库管理的内容详细,更多请关注乐哥常识网其他相关文章!

C++智能指针数组
废文海棠下载软件 废文,海棠
相关内容
发表评论

游客 回复需填写必要信息