这里的任务是指出这个片段的所有错误。我不知道代码是以 C 还是 C++ 形式呈现的,因此任何一种假设都是有效且有帮助的。
struct MyStructData
{
VOID* pPtr;
UINT32 flags;
}
VOID main()
{
MyStructData* pMyStructData = InitFunction();
// work done here
DeInitFunction(pMyStructData);
}
MyStructData* InitFunction()
{
MyStructData* pMyStructData = malloc(sizeof(MyStructData));
pMyStructData->pPtr = malloc(1024);
return pMyStructData;
}
VOID DeInitFunction(MyStructData* pMyStructData)
{
free(pMyStructData);
}
我看到声明了 void 指针,然后在 InitFunction
中,pMyStructData
具有 malloc,其结构体的大小为 MyStructData
。接下来,访问 pPtr
成员并对其进行 malloc-ed 一个大块 (1024)……这是我看到的问题所在。由于 pPtr
成员被声明为 void,pMyStructData
是否太小而无法分配 1024 个字节?
请帮助我了解这里发生了什么,以及我错过了什么。
答案 0 :(得分:2)
在语言标记从 C 更改为 C++ 之前提供了答案。
struct MyStructData
{
VOID* pPtr;
UINT32 flags;
}
C 中没有 VOID
或 UINT32
类型,除非您包含一些提供它们的标头。也许是一些 Windows 的东西?
在该结构声明之后还缺少 ;
。 (感谢wildplasser)
VOID main()
main
的有效签名为 int main(void)
或 int main (int argc, char *argv[])
或兼容。
{
MyStructData* pMyStructData = InitFunction();
没有类型 MyStructData
。使用 struct MyStructData
或添加 typedef
。
您没有提供 InitFunction()
的原型。
// work done here
DeInitFunction(pMyStructData);
}
此处相同:没有 DeInitFunction
的原型
MyStructData* InitFunction()
{
MyStructData* pMyStructData = malloc(sizeof(MyStructData));
再次:使用 struct MyStructData
。
在没有原型的情况下使用 malloc
。包括正确的标题。
pMyStructData->pPtr = malloc(1024);
基本有效(除了缺少原型),但您应该在取消引用之前检查 pMyStructData
是否为 NULL
。
return pMyStructData;
}
VOID DeInitFunction(MyStructData* pMyStructData)
{
free(pMyStructData);
}
正如 Johnny Mopp 提到的,pMyStructData->pPtr
没有被释放会导致内存泄漏。
再次:没有输入 VOID
和 MyStructData
。
再次:使用没有原型的函数 (free
)。
现在关于您的发现:
<块引用>我看到声明了void指针,然后在InitFunction中,pMyStructData有 malloc 与结构 MyStructData 的大小。
除了我上面提到的问题之外,这很好。这就是为结构分配内存的方式。
<块引用>接下来访问 pPtr 成员并对其进行 malloc-ed 一个大块 (1024)...这个 是我看到问题的地方。由于 pPtr 成员被声明为无效, pMyStructData 太小,无法分配 1024 字节?
那没问题。成员 ptr
指向由 malloc
提供的一些内存,与指针本身所在的结构没有关系。它不需要适应结构。
您只需在此之前检查 NULL
。