我可以将指向结构的指针的本地实例添加到结构的全局数组和 free() 中,该结构使用 malloc 分配内存吗
Can I add a local instance of a pointer to a struct with memory allocated with malloc to a global array of structs and free() properly
问题
Valgrind 通知我内存泄漏,但是无论如何我似乎无法弄清楚我是如何没有释放所有分配的内存的,这导致了我标题中的问题。我不会提供我的完整代码,所以我也不会附上整个 valgrind 报告,但我会指出 valgrind 认为问题出在哪里。
一些代码来进一步解释发生了什么
假设检查所有内存分配是否有错误,假设 while 循环最终终止
struct s1{
int total_s2; // assume some code initialise this to 0
struct s2 **arr_s2;
} struct1;
struct s2{
char *important_string
};
void add_s2_to_s1(struct s2 *struct2){
struct1.arr_s2 = realloc(s1.arr_s2, sizeof(struct s2 *) * s1.total_s2);
struct1.arr_s2[total_s2 - 1] = malloc(sizeof(struct s2)); // !mem lost!
struct1.arr_s2[total_s2 - 1] = struct2;
}
// in main
while(some_string){
struct s2 *struct2 = malloc(sizeof(*struct2));
struct2->important_string = malloc(sizeof(some_string) + 1);
s1.total_s2++;
add_s2_to_s1(struct2);
// some code to change some_string
}
for(int i = 0; i < total_s2; i++){
free(s1.arr_s2[i]->important_string);
free(s1.arr_s2[i]);
}
free(s1.arr_s2);
更多一点我的理解
即使从技术上讲,struct2
在 while 循环的每次迭代中都丢失了,但指向 struct2
内存的指针应该存储在 struct1
中的数组中,因此应该是能解脱没问题
内存泄漏问题最糟糕的部分是我的程序正在做我想要它现在做的事情,所以很想把我的手举到空中继续前进。但我知道我应该修复它,否则它可能会回来咬我的屁股。
这一行分配了一些字节并将指向这些字节的指针存储在变量 struct1.arr_s2[total_s2 - 1]
:
struct1.arr_s2[total_s2 - 1] = malloc(sizeof(struct s2)); // !mem lost!
这一行存储了一个指向变量struct1.arr_s2[total_s2 - 1]
中其他字节的指针:
struct1.arr_s2[total_s2 - 1] = struct2;
如您所知,一个变量一次只有一个值。变量 struct1.arr_s2[total_s2 - 1]
现在包含与变量 struct2
相同的值 - 它不会以某种方式记住您给它的其他值(一些新分配字节的地址)。
问题
Valgrind 通知我内存泄漏,但是无论如何我似乎无法弄清楚我是如何没有释放所有分配的内存的,这导致了我标题中的问题。我不会提供我的完整代码,所以我也不会附上整个 valgrind 报告,但我会指出 valgrind 认为问题出在哪里。
一些代码来进一步解释发生了什么
假设检查所有内存分配是否有错误,假设 while 循环最终终止
struct s1{
int total_s2; // assume some code initialise this to 0
struct s2 **arr_s2;
} struct1;
struct s2{
char *important_string
};
void add_s2_to_s1(struct s2 *struct2){
struct1.arr_s2 = realloc(s1.arr_s2, sizeof(struct s2 *) * s1.total_s2);
struct1.arr_s2[total_s2 - 1] = malloc(sizeof(struct s2)); // !mem lost!
struct1.arr_s2[total_s2 - 1] = struct2;
}
// in main
while(some_string){
struct s2 *struct2 = malloc(sizeof(*struct2));
struct2->important_string = malloc(sizeof(some_string) + 1);
s1.total_s2++;
add_s2_to_s1(struct2);
// some code to change some_string
}
for(int i = 0; i < total_s2; i++){
free(s1.arr_s2[i]->important_string);
free(s1.arr_s2[i]);
}
free(s1.arr_s2);
更多一点我的理解
即使从技术上讲,struct2
在 while 循环的每次迭代中都丢失了,但指向 struct2
内存的指针应该存储在 struct1
中的数组中,因此应该是能解脱没问题
内存泄漏问题最糟糕的部分是我的程序正在做我想要它现在做的事情,所以很想把我的手举到空中继续前进。但我知道我应该修复它,否则它可能会回来咬我的屁股。
这一行分配了一些字节并将指向这些字节的指针存储在变量 struct1.arr_s2[total_s2 - 1]
:
struct1.arr_s2[total_s2 - 1] = malloc(sizeof(struct s2)); // !mem lost!
这一行存储了一个指向变量struct1.arr_s2[total_s2 - 1]
中其他字节的指针:
struct1.arr_s2[total_s2 - 1] = struct2;
如您所知,一个变量一次只有一个值。变量 struct1.arr_s2[total_s2 - 1]
现在包含与变量 struct2
相同的值 - 它不会以某种方式记住您给它的其他值(一些新分配字节的地址)。