• c++20智能指针支持数组创建


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

     
  • 相关阅读:
    S2dao 简单Demo(转)
    Iphone SDK textField 打开和关闭键盘
    s2dao 入门知识2
    Eclipse tomcat Web页面调试
    s2dao 入门知识1
    java 面试
    Iphone SDK ActionSheet 在当前窗口弹出时间选择
    杭电2044
    杭电2076
    杭电2077
  • 原文地址:https://www.cnblogs.com/lidabo/p/15831158.html
Copyright © 2020-2023  润新知