C ++:如何获取浮点指针的地址并将其转换为void **

时间:2018-10-27 10:39:11

标签: c++ pointers casting

在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_castvoid *并仍然从返回值中获取地址,例如右值引用? (PS:我仍然不太了解右值引用,因此,如果这是菜鸟错误,请原谅我)

编辑 --------------

抱歉,我没有说清楚。我不想在这里声明void *。我只是想以某种方式执行“适当的” C ++强制转换才能完成此操作,最好仅一行完成。

更多修改 ----------

我确实了解使用正确的void *,正如@ M.M在下面指出的那样(实际上,这正是我现在已经做的一段时间了)。我只是很好奇是否有任何避免使用void *的方法。

1 个答案:

答案 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将这些块包装成一个智能指针。