c ++ make_shared <>与2d数组

问题描述

在处理2d数组分配时使用简单的指针是通过new通过这种方式完成的(假设矩阵为10x1000):

double ** dPtr ;
dPtr = new  double*  [10] ;
    for( size_t i =0 ; i<10 ; i++ ){
         dPtr[i] = new double [1000] ;
    }

现在,当使用智能指针时,我们可以将矩阵类型(假设使用shared_ptr定义为

std::shared_ptr<std::shared_ptr<double[]>[]> dPtr ;

使用make_shared<>执行相同分配的正确语法如何?

解决方法

我不会多次调用new,而是一次分配一个大缓冲区:net。当然,这取决于您想要哪种数据结构。单个缓冲区将具有更好的缓存局部性,并且可能更快得多,但这取决于您的要求。

此外,您正在做的是对矩阵的每一行都使用Error in configuration files. Project Files may be invalid. -这就是您想要的吗?最好有一个shared_ptr来管理整个矩阵:

CMake Error at C:/Program Files/CMake/share/cmake-3.19/Modules/FindCUDA.cmake:716 (message):
  Specify CUDA_TOOLKIT_ROOT_DIR
Call Stack (most recent call first):
  C:/Program Files (x86)/ZED SDK/zed-config.cmake:46 (find_package)
  tutorial 1 - hello ZED/cpp/CMakeLists.txt:21 (find_package)

如果您确实希望,也可以在每一行上使用一个shared_ptr:

double* array = new double[10 * 1000];
,

将代码直接转换为std::make_shared()会像这样:

std::shared_ptr<std::shared_ptr<double[]>[]> dPtr;
dPtr = std::make_shared<std::shared_ptr<double[]>>(10);
for( size_t i = 0 ; i < 10 ; i++ ){
     dPtr[i] = std::make_shared<double[]>(1000);
}

哪些可以进一步清理,例如:

using double_ptr_1D = std::shared_ptr<double[]>;
using double_ptr_2D = std::shared_ptr<double_ptr_1D[]>;

double_ptr_2D dPtr = std::make_shared<double_ptr_1D>(10);
for( double_ptr_1D &elem : dPtr ){
     elem = std::make_shared<double[]>(1000);
}

甚至:

using double_ptr_1D = std::shared_ptr<double[]>;

auto dPtr = std::make_shared<double_ptr_1D>(10);
for( auto &elem : dPtr ){
     elem = std::make_shared<double[]>(1000);
}

现在,就是说,直到C ++ 17才向std::shared_ptr添加数组支持,直到C ++ 20才向std::make_shared()添加数组支持。因此,如果您使用的是C ++ 17,则必须使用new[]手动构建数组,例如:

using double_ptr_1D = std::shared_ptr<double[]>;
using double_ptr_2D = std::shared_ptr<double_ptr_1D[]>;

double_ptr_2D dPtr( new double_ptr_1D[10] );
for(size_t i = 0; i < 10; ++i){
    dPtr[i] = double_ptr_1D( new double[1000] );
}

但是,如果您使用的是C ++ 11或C ++ 14,那么您很不走运,因为根本无法对阵列使用std::shared_ptr。 C ++ 11及更高版本中的std::unique_ptr具有数组支持,C ++ 14及更高版本中的std::make_unique()也具有数组支持,但是std::unique_ptr不具有std::shared_ptr具有的引用计数语义。如果确实需要,则必须手动实现自己的引用计数。