【发布时间】:2018-02-26 20:48:38
【问题描述】:
如何在下一个程序中释放“v struct”?
#include <stdio.h>
#include <stdlib.h>
struct Quaternion{
double r;
struct Q_vec{
double x;
double y;
double z;
} v;
};
int main(void){
struct Quaternion* q1Ptr = malloc(sizeof(struct Quaternion));
q1Ptr->r = 1.0;
q1Ptr->v.x = 2.0;
q1Ptr->v.y = 2.0;
q1Ptr->v.z = 2.0;
printf("%s = (%f, %f, %f, %f)\n", "q1", q1Ptr->r, q1Ptr->v.x, q1Ptr->v.y, q1Ptr->v.z);
free(q1Ptr);
printf("%s = (%f, %f, %f, %f)\n", "q1", q1Ptr->r, q1Ptr->v.x, q1Ptr->v.y, q1Ptr->v.z);
//Doesn't prints 'r', but prints x, y and z.
}
输出是:
q1 = (1.000000, 2.000000, 2.000000, 2.000000)
q1 = (0.000000, 2.000000, 2.000000, 2.000000)
所以,我不会删除指向 v 的指针。
还有,我的分配可以吗?
编辑:感谢您的所有回复!
这只是实际程序的一个小示例,我在释放指针后并没有尝试使用它。我只是注意到内存的持久性,想知道我是否有内存泄漏以及如何避免它。
【问题讨论】:
-
在释放指针后使用指针是未定义的行为。
-
您的
free没问题。但是之后访问指针不是。此外,它与您拥有嵌套结构这一事实无关。 -
为单个结构分配动态内存是不寻常的。
-
没有指向 v 的指针。v 嵌入在外部结构中,因此释放一个结构会释放所有内容。但正如所指出的,在释放它之后使用它是一个很大的禁忌。