[英]How to free pointer memory inside a function?
我不熟悉指针的使用,我正在尝试编写一个程序来学习使用它们。 我有一个问题问你。 我有一个文件lib.h
,在其中我定义了 main 中所需的所有函数。 在这个文件中,我有一个简单的数据struct
:
struct Slave
{
char **all_samples;
int number_of_samples;
char **last_samples;
int *RSSI;
int *AGC;
int *AUTH;
};
如您所见,此结构的成员是指针(指向 int 的指针、指向指针的指针等)。 在同一个文件中,我有几个函数。 为简单起见,考虑其中之一。 在这个 function 中,我从一个文件中读取了几行并将它们放入数组字符串all_samples
( i
是先前正确计算的行数):
struct Slave *read_slaves_file(char *file_path, char *slave)
{
...
struct Slave *slave_ptr = malloc(sizeof(struct Slave *));
slave_ptr->all_samples = malloc(i * sizeof(char *));
slave_ptr->all_samples = all_samples;
return slave_ptr;
}
我省略了代码中不相关的部分(我的问题更具理论性,我的程序中没有错误)。 如您所见,我返回一个指向结构的指针,因此,在 main 内部:
#include "lib.h"
int main(){
struct Slave *slave_1 = malloc(sizeof(struct Slave *));
slave_1 = read_slaves_file(FILE_PATH, SLAVE_1);
return 0;
}
一切似乎都很好......但是,我有一个疑问。 所有的memory在前面的function里面动态分配:
struct Slave *slave_ptr = malloc(sizeof(struct Slave *));
slave_ptr->all_samples = malloc(i * sizeof(char *));
应该在哪里解除分配? 是否应该解除分配? 我想在返回指针之前我无法释放 memory。 那么,该怎么做呢?
我的程序没有错误
你有很多错误。
struct Slave *slave_1 = malloc(sizeof(struct Slave *)); slave_1 = read_slaves_file(FILE_PATH, SLAVE_1);
这会重新分配slave_1
从而创建 memory 泄漏。 在调用者和 function 内部分配 memory 是没有意义的。 下定决心在哪里进行分配。
malloc(sizeof(struct Slave *))
这应该是malloc(sizeof(struct Slave))
或者如果您更喜欢malloc(sizeof(*slave_1))
。 相同的错误存在于多个地方。
slave_ptr->all_samples = malloc(i * sizeof(char *));
slave_ptr->all_samples = all_samples;
和以前一样的错误。 通过使用赋值运算符,您可以复制指针或复制数据。 除非您更改操作数的类型,否则它不能同时做这两件事。 在这一点上,我将退出动态分配并研究指针是如何工作的,特别是非正式地称为“软拷贝”与“硬拷贝”的东西。
应该在哪里解除分配?
最好的选择是始终让调用者进行分配并让它们提供指向缓冲区的指针,以便 function 填满。 这将分配与算法分开。 但是,这可能并不总是一种选择。
另一个好的设计是让分配某些东西的代码模块也负责清理自己的烂摊子。 因此,如果您的 lib 提供了 function 返回指向动态分配数据的指针,则同一个 lib 还应该提供另一个 function 来清理该数据。
一些设计不太好的函数返回一个指针并期望调用者清理它(参见例如 POSIX getline
)。 这是有问题的,但如果你正确记录调用者负责清理,你就可以侥幸逃脱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.