指向无效函数参数的指针

时间:2015-02-05 15:34:34

标签: c++ c pointers

我有一个我正在修改的驱动程序是由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函数来消除这些错误,我需要做些什么的帮助将非常感激。

2 个答案:

答案 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()