当指针没有指向它时,char指针的内容会发生什么?

时间:2017-05-25 02:20:35

标签: c pointers

我的意思是这样的。

int8_t *pt1 = malloc(sizeof(int8_t) * 10);
int8_t *pt2 = malloc(sizeof(int8_t) * 10);

pt1 = pt2;

这里,pt1分配了一个内存。但现在正指向pt2。那么分配给pt1的内存会发生什么?有没有办法释放它,即使你没有保存它的指针值?

6 个答案:

答案 0 :(得分:4)

内存仍然属于您的应用程序,并且您不再存储该地址以释放它。这是所有内存泄漏的根源。

答案 1 :(得分:3)

您的问题有两个部分:

  1.   

    分配给pt1的内存会发生什么?

    内存pt1指向无法访问 - 尽管内存仍然已分配。另一方面,pt1pt2都指向相同的内存位置。这导致程序占用的内存超出了它的需要和使用(即内存位置pt1最初指向 - 该位置不能再使用,但仍然被程序占用) - 名为{ {3}}

  2.   

    有没有办法释放它,即使你没有保存它的指针值?

    在执行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)

它被称为丢失堆 - 动态变量并导致内存泄漏

Lost Heap-Dynamic Variable

丢失的堆动态变量是分配的堆动态变量 用户程序不再可访问的变量。这样 变量通常称为垃圾,因为它们没用 出于他们原来的目的,他们也无法重新分配 对于该计划中的一些新用途。丢失的堆动态变量 通常由以下操作序列创建:

  1. 指针pt1设置为指向新创建的堆动态 变量
  2. pt1稍后设置为指向另一个新创建的堆动态 变量
  3. 第一个堆动态变量现在无法访问或丢失。 这有时被称为内存泄漏。内存泄漏是 一个问题,无论语言是否使用隐式或 显式释放。

    来源:编程语言的概念10th - Robert W. Sebesta

答案 5 :(得分:-1)

如果您不释放内存,操作系统将释放内存。 BTW:如果没有人使用,shared_ptr将释放内存。 http://www.boost.org/doc/libs/1_64_0/libs/smart_ptr/shared_ptr.htm