我的意思是这样的。
int8_t *pt1 = malloc(sizeof(int8_t) * 10);
int8_t *pt2 = malloc(sizeof(int8_t) * 10);
pt1 = pt2;
这里,pt1分配了一个内存。但现在正指向pt2。那么分配给pt1的内存会发生什么?有没有办法释放它,即使你没有保存它的指针值?
答案 0 :(得分:4)
内存仍然属于您的应用程序,并且您不再存储该地址以释放它。这是所有内存泄漏的根源。
答案 1 :(得分:3)
您的问题有两个部分:
分配给pt1的内存会发生什么?
内存pt1
指向无法访问 - 尽管内存仍然已分配。另一方面,pt1
和pt2
都指向相同的内存位置。这导致程序占用的内存超出了它的需要和使用(即内存位置pt1
最初指向 - 该位置不能再使用,但仍然被程序占用) - 名为{ {3}}
有没有办法释放它,即使你没有保存它的指针值?
在执行pt1 = pt2;
之前,您应该调用free(pt1);
函数,例如pt1
- 这将取消分配@Mcq
指向的内存位置。
答案 2 :(得分:0)
除非使用free()
函数释放内存分配或发生内存泄漏,否则应用程序仍会占用内存。
对于上述问题,你需要写一下
int8_t *pt1 = malloc(sizeof(int8_t) * 10);
int8_t *pt2 = malloc(sizeof(int8_t) * 10);
pt1 = pt2;
free(pt2);
将释放pt2的记忆。
在java中,这由垃圾收集器
处理答案 3 :(得分:0)
应用程序分配的内存,特别是类似Linux的系统,只要应用程序正在运行,就属于该应用程序。因此,您的进程分配的内存将从应用程序的地址空间中获取,并且为了更好的内存利用率,如果应用程序不再需要使用它,则应该释放该块。因此,如果应用程序在不释放的情况下继续分配内存,则在某个时间点,系统可能会超出地址空间并且因缺少内存而导致进程被终止。但是,如果应用程序在没有释放任何内存块的情况下终止,则该内存块由父进程拥有,并运行清理例程以释放该内存块。
答案 4 :(得分:0)
它被称为丢失堆 - 动态变量并导致内存泄漏
丢失的堆动态变量是分配的堆动态变量 用户程序不再可访问的变量。这样 变量通常称为垃圾,因为它们没用 出于他们原来的目的,他们也无法重新分配 对于该计划中的一些新用途。丢失的堆动态变量 通常由以下操作序列创建:
第一个堆动态变量现在无法访问或丢失。 这有时被称为内存泄漏。内存泄漏是 一个问题,无论语言是否使用隐式或 显式释放。
来源:编程语言的概念10th - Robert W. Sebesta
答案 5 :(得分:-1)
如果您不释放内存,操作系统将释放内存。 BTW:如果没有人使用,shared_ptr将释放内存。 http://www.boost.org/doc/libs/1_64_0/libs/smart_ptr/shared_ptr.htm