我有一个我正在修改的驱动程序是由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(Buffer);
在此示例中,“Buffer”是指向unsigned char的指针。
unsigned char *Buffer;
出于参考目的,对于此特定示例,我收到的错误是“无法将参数1从'unsigned char *'转换为'void **'”
很长一段时间以来,我用直接的C或C ++做了很多事情,指针从来都不是我强大的套件。根据错误,我的假设是这个错误与不在函数调用中提供强制转换有关,但考虑到如何从标准C库中使用free()函数,似乎这不应该是必要的。关于如何调用FREE函数来消除这些错误,我需要做些什么的帮助将非常感激。
答案 0 :(得分:0)
freeMemory
用于创建安全免费,因为您可以为同一指针调用它两次而不会造成任何伤害。我不喜欢这样,它只会隐藏你的错误,但看到它的情况很常见。
Quentin指出here解释了这个错误的原因。
代码的替代方案是:
#define FREE(pBuffer) \
{ \
void *tmp; \
tmp = pBuffer; \
freeMemory(&tmp); \
pBuffer = tmp; \
}
答案 1 :(得分:0)
运行代码变体时遇到的问题是VirualFree和VirtualAlloc的使用不一致,即在您提供的代码示例中,我看不到VirtualAlloc()
用法的指示,应该与{一起使用} {1}}。
此外,当我尝试使用VirtualFree()
将内存分配给特定地址时,它总是失败,所以我让系统指定地址。下面是一个代码片段,演示了如何分配和释放页面内存。
<强> 修改 强>
现在解决您的宏问题 ,它使用了Jonaton的宏定义建议(带有两个额外的VirtualAlloc()
)。
Adapted from here :(这构建并运行时没有错误,演示了与;
一起使用的VirtualAlloc()
的使用情况)< / p>
VirtualFree()