为什么我不能通过引用传递 void*
?编译器允许我声明一个具有以下签名的函数:
static inline void FreeAndNull(void*& item)
但是当我尝试调用它时,我收到以下错误:
Error 1 error C2664: 'FreeAndNull' : cannot convert parameter 1 from 'uint8_t *' to 'void *&'
将其转换为 void*
也不起作用
另外,有什么解决方法吗?
最佳答案
答案是肯定的,你可以通过引用传递一个 void*
,你得到的错误与此无关。问题是,如果您有一个通过引用获取 void*
的函数,那么您只能将实际上是 void*
的变量作为参数传递。这是有充分理由的。例如,假设你有这个函数:
void MyFunction(void*& ptr) {
ptr = malloc(137); // Get a block of raw memory
}
int* myIntArray;
MyFunction(myIntArray); // Error- this isn't legal!
由于指定的调用,上面的代码是非法的,并且有充分的理由。如果我们可以将 myIntArray
传入 MyFunction
,它将被重新分配为指向不是 类型的
数组。因此,在从函数返回时,您的 void*
缓冲区>intint*
将指向 void*
类型的数组,从而颠覆了类型系统。这并不是说 C++ 有一个强大的类型系统——它没有——但如果你要颠覆它,你必须显式地进行一些强制转换。
你同样不能这样做:
void MyFunction(void*& ptr) {
ptr = malloc(137); // Get a block of raw memory
}
int* myIntArray;
MyFunction((void*)myIntArray); // Error- this isn't legal!
作为一个很好的引用,你为什么不能这样做,想想这段代码:
void OtherFunction(int& myInt) {
myInt = 137;
}
double myDouble;
OtherFunction((int)myDouble); // Also error!
这是不合法的,因为如果您尝试将 double
传递给采用 int&
的函数,那么由于 int
和 double
具有根本不同的二进制表示,您最终会用无意义的数据破坏 double
的位。如果这个 Actor 阵容是合法的,就有可能做这样的坏事。
所以简而言之,是的,你可以传入一个 void* &
,但如果你这样做,你必须传入真正的 void*
。正如 Erik 上面所指出的,如果您想释放指针并将指针模板归零,那么您可以这样做。
如果你真的想将 uint_8*
传递给你的函数,你可以这样做:
uint_8* uPtr = /* ... */
void* ptr = uPtr;
FreeAndNull(ptr);
uPtr = (uint_8*) ptr;
这需要显式转换来告诉编译器“是的,我知道这可能不安全,但我还是要这样做。”
希望这会有所帮助!
关于c++ - 通过引用传递 void*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5011071/