DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

一、c++11中的智能指针数组创建

在c++11中引入了智能指针这个概念,这个非常好,但是有一个问题显然被忘记了,如何动态创建智能指针数组,在c++11中没有提供直接的函数。换句话说,创建智能指针的make_shared,不支持创建数组。那在c++11中如何创建一个智能指针数组呢?只能自己封装或者变通实现,在c++14后可以支持构造函数创建智能指针数组,可这仍然不太符合技术规范发展的一致性,可继承性。

二、c++20中的智能指针数组的创建

基于上述的情况,在c++20中使用std::make_shared提供了智能数组指针的一次性创建。看一下定义:

std::make_shared, std::make_shared_for_overwrite
 C++ Utilities library Dynamic memory management std::shared_ptr 
Defined in header <memory>
template< class T, class... Args >
shared_ptr<T> make_shared( Args&&... args );(1)	(since C++11)
(T is not array)
template< class T >
shared_ptr<T> make_shared( std::size_t N );(2)	(since C++20)
(T is U[])
template< class T >
shared_ptr<T> make_shared();(3)	(since C++20)
(T is U[N])
template< class T >
shared_ptr<T> make_shared( std::size_t N, const std::remove_extent_t<T>& u );(4)	(since C++20)
(T is U[])
template< class T >
shared_ptr<T> make_shared( const std::remove_extent_t<T>& u );(5)	(since C++20)
(T is U[N])
template< class T >
shared_ptr<T> make_shared_for_overwrite();(6)	(since C++20)
(T is not U[])
template< class T >
shared_ptr<T> make_shared_for_overwrite( std::size_t N );(7)	(since C++20)
(T is U[])

显然,从c++20模板的定义支持数组了,看一下一个具体的例子:

void TestArray()
{
    auto pa1 = std::make_shared<int[]>(5);
    auto pa2 = std::make_shared<int[5]>();

    std::cout << pa1[0] << "-" << pa1[4] << std::endl;
    std::cout << pa2[1] << "-" << pa1[3] << std::endl;

    pa1[0] = 8;
    pa1[1] = 9;
    pa2[4] = 10;
    pa2[2] = 3;

    auto ptemp = pa1.get();
    std::cout << ptemp << std::endl;

    std::cout << pa1[0] << "---" << pa2[2] << std::endl;
}
int main()
{
    TestArray();
}

运行结果:

0-0
0-0
0000029A47E36A70

这个例子非常简单,可以发现创建的数组默认值是0,通过智能指针直接给数组赋值,然后在内存中可以看到具体的数据,同时打印相关的地址:

在这里插入图片描述

这个就好使多了,对数组的管控其实也是非常多的。

三、总结

STL库中的std::make_shared支持数组后,显然对规范智能指针的应用起到了一个非常好的统一效果。技术的进步不是突然的爆发的,而是在不断的积累的基础上,让外人看上去似乎是突然爆发一样。站在前人的基础上,不断的迭代,这才是王道。

 
posted on   DoubleLi  阅读(815)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2021-01-21 inux top命令的用法详细详解
2021-01-21 mysql占用CPU超过100%解决过程
2019-01-21 vld for memory leak detector (release version)
2019-01-21 在Release版本下使用VLD
2015-01-21 CURL 和LIBCURL C++代码 上传本地文件,好不容易碰到了这种折腾我几天的代码
2014-01-21 VS2008调试技巧收集备用
2013-01-21 c++读写文件和测试程序运行时间的例子
点击右上角即可分享
微信分享提示