【问题标题】:What happens to a local pointer variable inside a function that has been dynamically allocated?动态分配的函数内的局部指针变量会发生什么?
【发布时间】:2020-02-19 07:37:44
【问题描述】:

我很想知道如果你在函数中声明一个 int 指针,然后使用 malloc 动态分配它会发生什么

void testing(){
   int *p = malloc(sizeof(int));
   *p = 5;
}

即使在函数执行完成后指针被销毁,数据(在本例中为 5)是否仍然存在于堆中?

【问题讨论】:

    标签: c pointers malloc global-variables


    【解决方案1】:

    在这个函数中

    void testing(){
       int *p = malloc(sizeof(int));
       *p = 5;
    }
    

    局部变量(指针)p 具有自动存储期限。

    对于这样一个没有变长数组类型的对象, 它的生命周期从进入它所在的块开始 关联,直到该块的执行以任何方式结束。(C 标准)。

    使用 malloc 占用分配内存的对象具有分配的内存持续时间。

    分配对象的生命周期从分配开始直到 解除分配。 (C 标准)。

    因此,由于内存没有显式释放,因此对象的生命周期会延长,直到程序完成。您无法访问该对象或重用分配的内存,因为在退出函数后,它存储在局部变量p 中的地址会丢失。这种情况会引发内存泄漏。

    【讨论】:

      【解决方案2】:

      数据(本例中为 5 个)是否存在于堆中,即使 指针被破坏了?

      是的,它被称为内存泄漏。您分配了内存并将其引用存储在指针p 中,当p 被销毁时,您只会丢失对分配内存的引用,从而导致内存泄漏。

      【讨论】:

      • "stored [...] its reference" 更好的说法是“存储了它的地址”。尽管“引用”在 C 中不存在,但它们在 C++ 中存在,并且有所不同,而且由于 C 和 C++ 是表亲,这可能会引起混淆。
      • @alk 我同意你的看法。谢谢。
      【解决方案3】:

      使用malloc()calloc() 分配的内存不会自动释放。您必须显式调用free() 才能取消分配内存。

      // Allocate
      int* p = (int*)malloc(10 * sizeof(int)); 
      
      // De-allocate
      free(p);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多