在C ++编程中,我经常需要获取一个指针的地址并将其转换为void **
。例如,通常在使用CUDA时:
int main() {
float *data;
size_t size = sizeof(float) * 1024;
CUDA_CHECK(cudaMalloc((void **)&data, size)); // question about this line
...
CUDA_CHECK(cudaFree(static_cast<void *>(data)));
return 0;
}
我的问题是使用C样式类型强制转换将float **
强制转换为void **
,因为我不想在C ++编程中使用它。
到目前为止,我一直在使用reinterpret_cast<void **>(&data)
,但我对此并不满意。由于某些原因,我认为这不是正确的方法。
我曾经非常愚蠢地尝试过&static_cast<void *>(data)
,因为这样做显然无法尝试从右值获取地址。
我已经在Google和Stack Overflow上进行了一些搜索,但是我很难为查询找到合适的关键字。
我也一直在学习右值引用的概念,但我认为它不是针对此问题而设计的。
所以我的问题是,在这种情况下,从float **
转换为void **
的正确C ++方法是什么?另外,是否有一种方法可以从static_cast
到void *
并仍然从返回值中获取地址,例如右值引用? (PS:我仍然不太了解右值引用,因此,如果这是菜鸟错误,请原谅我)
编辑 --------------
抱歉,我没有说清楚。我不想在这里声明void *
。我只是想以某种方式执行“适当的” C ++强制转换才能完成此操作,最好仅一行完成。
更多修改 ----------
我确实了解使用正确的void *
,正如@ M.M在下面指出的那样(实际上,这正是我现在已经做的一段时间了)。我只是很好奇是否有任何避免使用void *
的方法。
答案 0 :(得分:4)
我会这样:
void *newdata;
CUDA_CHECK(cudaMalloc(&newdata, size));
float *data = static_cast<float *>(newdata);
CUDA_CHECK(cudaFree(data)); // or pass newdata, doesn't matter
很明显,我用RAII将这些块包装成一个智能指针。