问题描述
在处理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
具有的引用计数语义。如果确实需要,则必须手动实现自己的引用计数。