当然是需要 这样子,毕竟c里面没有c++的析构函数,这些内存关系 都要 自己处理
第一种情况:name指针也申请了堆内存,此时需要释放name指向的内存后再释放结构体节点指针
Student *p = (Student*)malloc(sizeof(Student)); // 申请内存:结构体一个节点
if (p == nullptr) { return 0; }
p->name = (char*)malloc(sizeof(char) * kNameLen); // 申请内存:name 指针指向多大可以使用的内存
p->age = 22;
strncpy(p->name, "lilie", strlen("lilie"));
// 释放:先释放
p->name free(p->name);
// 再释放
p free(p);
p = nullptr;
第二种情况:name指针没有申请堆内存,我们只需要释放结构体节点指针指向的内存就可以了
Student *p = (Student*)malloc(sizeof(Student)); // 申请内存:结构体一个节点
if (p == nullptr) { return 0; }
p->age = 22; // 无需释放p->name所指向内存,因为压根就没有申请内存,只需要释放 p
free(p);
p = nullptr;
本文探讨了在C语言中如何手动管理内存,特别是在处理结构体及其成员时的注意事项。两种不同情况被详细阐述:当结构体成员指针申请了堆内存时,需要先释放该指针再释放结构体本身;而当成员指针未申请堆内存时,只需释放结构体即可。这强调了C语言程序员必须关注内存释放的顺序以避免内存泄漏。
1764

被折叠的 条评论
为什么被折叠?



