【发布时间】:2014-10-13 04:11:18
【问题描述】:
我正在尝试返回一个指向我创建的新结构的指针,但我遇到了分段错误并且不确定如何以正确的方式执行此操作。
这是我现在正在使用的:
typedef struct person{
int age;
char *name;
}Person;
Person *new_person(int age, const char *name){
Person *x = malloc(sizeof(x));
x->age = age;
strcpy(x->name, name);
return x;
}
我一直在使用我在网上找到的教程/其他问题中的代码进行调整。但我似乎无法弄清楚我做错了什么,无论是我分配内存的方式还是我返回指针的方式。
我遇到的另一个问题是将任何关联内存与某个人解除分配。假设我想删除一个人,并释放与该人动态关联的内存。我搜索了它,它说我应该使用free 方法。但是我仍然会遇到内存泄漏。我有这样的设置:
void kill_person(Person *x){
free(x->name);
free(x);
}
我应该打电话给free(*x)吗?我也应该打电话给free(x->name)吗?
【问题讨论】:
-
您应该在调用
free(x);之前调用free(x->name);,假设您首先使用单独的分配来分配x->name。对于代码中的每个malloc(),应该有一个匹配的free()。 (使用realloc()会使事情稍微复杂化,但基本概念仍然有效——对于每个尚未释放的分配,您应该能够指向匹配的free()。) -
@JonathanLeffler 我将 op 更新为我正在使用的内容,但我仍然遇到内存泄漏并且没有正确释放
-
泄漏的方法有无数种,我们无法猜出你做了什么。您可以使用
valgrind吗?如果是这样,请使用它(但使用-g编译代码以获得关于泄漏发生位置的更好报告)。如果您无法获得valgrind,则必须生成一个 MCVE (How to create a Minimal, Complete, and Verifiable Example?) 或 SSCCE (Short, Self-Contained, Correct Example) — 相同基本思想的两个名称和链接 — 更新(而不是覆盖)问题。但如果可以,请使用valgrind。 -
@JonathanLeffler 我对你所说的有点困惑。我正在做的是一项任务,我知道我在运行我提供的测试时遇到了内存泄漏。测试运行我的方法并检查我在运行方法后是否正确释放了内存。 (所以我知道问题出在其中一种方法中)
-
我是说有很多不同的方法来创建泄漏,如果没有看到所有的分配和释放代码,我们不可能猜出你正在使用哪种泄漏方法。这是不幸的,但也是生活中的事实。你不应该在这里向我们展示你所有的代码。但是,如果您创建一个仍然泄漏的 MCVE,您可以证明这一点。但是最好学习
valgrind,它会直接告诉您内存泄漏的位置。
标签: c pointers struct segmentation-fault malloc