[英]C++: How to get the address of a float pointer and convert it to void**
在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 *
的正確方法,如@MM在下面指出的(實際上,這正是我現在已經做的一段時間了)。 我只是好奇是否有任何避免使用void *
適當方法。
我會這樣:
void *newdata;
CUDA_CHECK(cudaMalloc(&newdata, size));
float *data = static_cast<float *>(newdata);
CUDA_CHECK(cudaFree(data)); // or pass newdata, doesn't matter
很顯然,我會使用RAII將這些塊包裝成一個智能指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.