【发布时间】:2015-02-05 15:34:34
【问题描述】:
我有一个我正在修改的驱动程序,它是由其他人用 C 编写的。由于我需要添加一些 C++ 函数调用,我现在使用 C++ 编译器而不是 C 编译器(在 Visual Studio 2012 中)构建驱动程序。当我改用 C++ 时,我收到了很多构建错误,除了少数之外,我都能修复所有这些错误。少数错误都与对同一函数的调用有关。我在网上广泛搜索,试图找到解决这个问题的方法,但没有成功。所以下面是这个问题的组成部分,我希望能让有人帮助我解决这个问题。
首先,这里是被调用的函数。您可能想知道为什么最初的 S/W 开发人员可以在标准 C 库中使用 free() 函数时创建自己的自定义空闲内存函数。我不知道为什么会这样,但因为它工作得很好,我犹豫要改变它。
void freeMemory(void **pBuffer)
{
BOOL result;
ASSERT(pBuffer != NULL);
// see if buffer is already been freed
if (*pBuffer == NULL)
{
return;
}
result = VirtualFree(
*pBuffer, // LPVOID lpAddress, // address of memory
0, // SIZE_T dwSize, // size of memory
MEM_RELEASE // DWORD dwFreeType // operation type
);
// see of we were able to successfully free the memory
if (result == FALSE)
{
ASSERT(FALSE);
return;
}
// Mark the buffer pointer as now being free
*pBuffer = NULL;
}
所以这个难题的下一个部分是#define,如下所示:
#define FREE(pBuffer) freeMemory(&(pBuffer))
最后,下面是对这个 FREE 函数的众多调用之一:
FREE(Buffer);
在本例中,“Buffer”是指向无符号字符的指针。
unsigned char *Buffer;
出于参考目的,对于这个特定示例,我收到的错误是“无法将参数 1 从 'unsigned char *' 转换为 'void **'”
我已经很久没有使用 C 或 C++ 做过很多事情了,而指针从来都不是我的强项。基于该错误,我的假设是此错误与未在函数调用中提供强制转换有关,但考虑到如何从标准 C 库中使用 free() 函数,似乎没有必要这样做。任何关于如何调用 FREE 函数以消除这些错误的帮助,我们将不胜感激。
【问题讨论】:
-
内存最初是由 VirtualAlloc 提交的吗?
-
那个错误信息应该是“[...] from
unsigned char **tovoid **[...]” 并且这个转换在 C 中也不能工作. -
简单地使用
#define FREE(pBuffer) freeMemory(&((void*)(pBuffer)))怎么样? -
@alk - 我尝试了你的建议,现在得到“错误 C2102:'&' 需要 l-value”