这里的任务是指出这个代码片段中的所有错误。我不知道代码是用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
有与MyStructData
结构体大小相同的malloc。接下来访问pPtr
成员并malloc-ed一个大块(1024)…这就是我看到的问题所在。由于pPtr
成员被声明为void,pMyStructData
太小而不能分配1024字节?
请帮助我了解这里发生了什么,以及我错过了什么。
在语言标签从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
没有被释放,导致内存泄漏。
Again: No typeVOID
andMyStructData
.
再次:使用函数(free
)没有原型。
现在关于你的发现:
我看到void指针被声明,然后在InitFunction中,pMyStructData有MyStructData.
除了我上面提到的问题之外,这很好。这就是为结构体分配内存的方式。
接下来访问pPtr成员并malloc-ed一个大块(1024)…这这就是我看到的问题所在。由于pPtr成员被宣布为无效,pMyStructData太小,不能分配1024字节?
那不是问题。成员ptr
指向malloc
提供的内存,与指针本身所在的结构体没有关系。它不需要适合结构体。在此之前,您只应该检查NULL
。