在嵌套结构上使用 free
Using free on nested structures
如何在下一个程序中释放 '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()
不需要清除您分配的内存内容,并且 free()
不会更改指针 q1Ptr
指向的内存地址。 free()
只是 returns 操作系统的资源(或任何分配给您的内存)。分配给该变量的值可以持续存在,并且不能保证被 free()
清零。您仍然看到在 free()
调用后分配的某些值这一事实并不表示 free()
调用失败。
但是,使用指向已经 free
d 的内存的指针会导致未定义的行为,因为它仍然指向您分配的内存,但它不再属于您使用或访问。在你的系统中,这一次似乎没问题,但你不能依赖它。
您无法访问释放后释放的变量。 free() 不会删除内存中该位置的值,它只是让系统知道您已释放它并且可以使用和覆盖它。
如何在下一个程序中释放 '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()
不需要清除您分配的内存内容,并且 free()
不会更改指针 q1Ptr
指向的内存地址。 free()
只是 returns 操作系统的资源(或任何分配给您的内存)。分配给该变量的值可以持续存在,并且不能保证被 free()
清零。您仍然看到在 free()
调用后分配的某些值这一事实并不表示 free()
调用失败。
但是,使用指向已经 free
d 的内存的指针会导致未定义的行为,因为它仍然指向您分配的内存,但它不再属于您使用或访问。在你的系统中,这一次似乎没问题,但你不能依赖它。
您无法访问释放后释放的变量。 free() 不会删除内存中该位置的值,它只是让系统知道您已释放它并且可以使用和覆盖它。