c++ - 通过引用传递 void*

标签 c++ function pointers reference void-pointers

为什么我不能通过引用传递 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* 缓冲区>int 数组。因此,在从函数返回时,您的 int* 将指向 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& 的函数,那么由于 intdouble 具有根本不同的二进制表示,您最终会用无意义的数据破坏 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/

相关文章:

python - Python 中的 Levenshtein 距离循环

c - 如何在 C 中进行 char* 数组元素交换?

c++ - 我创建了 deque<CObject*> 并添加了不同类型的元素。我怎样才能改变这个元素的属性?

c++ - 将 Makefile 转换为 Tiva C 系列的 CMakeLists.txt

jquery - Windows 应用程序是否可以与网页交互?

r - 如何在函数 rep() 中分配多个 "each"值?

c++ - 如果私有(private)变量匹配,则从 vector 中删除对象

javascript - Protractor - X 不是函数

arrays - 结构体数组成员地址问题

c++ - 类和指针删除