我在类型转换方面遇到了一些问题。 这是工作代码:
void init(signed char[16][16][16])
{
}
int main()
{
auto cache = new signed char[16][16][16];
init(cache);
return 0;
}
如果在 Windows 中编译,这里是一个有问题的代码。在 Linux 中,这段代码工作得很好:
int main()
{
std::shared_ptr<signed char[16][16][16]> ptr;
ptr.reset(new signed char[16][16][16]);
init(ptr.get());
return 0;
}
MSVS 给我一个错误:Error C2664 'void init(signed char [][16][16])': cannot convert argument 1 from 'signed char (*)[16][16][16]' to '签名字符 [][16][16]'
如何通过 shared_ptr 正确使用 multidim 数组? “自动缓存”的类型名称是什么?
最佳答案
这是一个 3D shared_ptr
using myType = signed char;
using ManagedInt = std::shared_ptr<std::shared_ptr<std::shared_ptr<myType>>> ;
const int N = 16;
{
auto managedMat = ManagedInt();
managedMat.reset(new std::shared_ptr<std::shared_ptr<myType>>[N], [](auto p) {
for(uint32_t i = 0; i <N; ++i){
p->reset();
}
});
for(uint32_t i = 0; i< N;++i){
managedMat.get()[i].reset(new std::shared_ptr<myType>[N], [](auto p) {
for(uint32_t i = 0; i <N; ++i){
p->reset();
}
});
for(uint32_t j = 0; j < N; ++j){
managedMat.get()[i].get()[j].reset(new myType[N], [](auto p) {
delete[] p;
});
}
}
for(uint32_t i = 0; i < N; ++i)
for(uint32_t j = 0; j < N; ++j)
for(uint32_t k = 0; k < N; ++k)
managedMat.get()[i].get()[j].get()[k] = j;
for(uint32_t i = 0; i < N; ++i)
for(uint32_t j = 0; j < N; ++j)
for(uint32_t k = 0; k < N; ++k)
std::cout<<managedMat.get()[i].get()[j].get()[k];
}
如果可以的话,我建议使用 vector
关于c++ - shared_ptr 中 multidim 数组的类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57337031/