关于内存回收的问题
//声明节点结构typedef struct Link {
intelem;//存储整形元素
struct Link *next;//指向直接后继元素的指针
}link;
//创建链表的函数
link * initLink() {
link * p = (link*)malloc(sizeof(link));//创建一个头结点
link * temp = p;//声明一个指针指向头结点,用于遍历链表
int i = 0;
//生成链表
for (i = 1; i < 5; i++) {
//创建节点并初始化
link *a = (link*)malloc(sizeof(link));
a->elem = i;
a->next = NULL;
//建立新节点与直接前驱节点的逻辑关系
temp->next = a;
temp = temp->next;
}
return p;
//程序中使用malloc申请了内存,用*a指向这个内存地址,但是这个指针算是局部变量,这样函数运行以后不会自动释放了这块内存吗?
}
局部变量被释放了跟你内存之内malloc的东西存在不冲突啊
只不过是没有指针指向你malloc的内存空间而已但是它还是存在的
所以我说死是死七窍流血是七窍流血不能混为一谈{:10_256:}
这是两块内存,变量 a 是一块内存,malloc 申请的是一块内存
函数结束,变量 a 的那一块内存自动释放了,malloc 的那一块内存没有释放,malloc 申请的内存是不会自动释放的,除非调用 free 函数
当然,如果程序结束的话,操作系统会把程序用到的全部内存回收
这就好比房子的产权,产权到期后,国家可能对其进行拆迁,但是土地还在啊。 lei1996 发表于 2021-8-12 22:39
局部变量被释放了跟你内存之内malloc的东西存在不冲突啊
只不过是没有指针指向你malloc的内存空间而已 ...
感谢。只是不明白楼下回复的一句话:“当然,如果程序结束的话,操作系统会把程序用到的全部内存回收”。
那到底是不是要free呢? “当然,如果程序结束的话,操作系统会把程序用到的全部内存回收”
你可以理解为你的代码只有在运行的时候才会调用内存等资源 一旦运行完成的话会有操作系统善后把你代码运行时用到的资源全部释放掉保证内存不会越用越少
按道理来说 如果你开辟的内存不用时是一定要提前free的防止内存泄漏(虽然有时不free好像也没啥事,但是最好养成好习惯)
举个简单栗子:如果你一直malloc申请内存而不free不用的资源时会导致能用的内存空间越来越少可能就会在你代码运行的过程中产生内存溢出的错误而等不到你的代码结束了 按道理来说 对于你malloc的内存 如果不用的时候一定要free掉(虽然有时不free也没啥大影响,但是最好有个好习惯)
当然,如果程序结束的话,操作系统会把程序用到的全部内存回收
这句话简单点说就是代码在 运行 的时候会申请内存资源啥的 等到代码运行结束操作系统会将你代码运行时申请的内存资源总的释放掉 顺便替你擦擦不free的屁股
但是极端情况下就会出错栗子:如果你一直malloc内存而不free不用的内存 可能导致代码在运行时就内存溢出从而出错
页:
[1]