【问题标题】:C++ static array leading to memory leak?C ++静态数组导致内存泄漏?
【发布时间】:2011-02-15 01:59:15
【问题描述】:

假设我有类似...

void foo()
{
    char c[100];
    printf("this function does nothing useful");
}

调用 foo 时,它会在堆栈上创建数组,当它超出范围时,是否会自动释放内存?还是 c 被破坏了,但内存仍然分配,除了重新启动计算机之外没有其他方法可以访问它/取回它?

【问题讨论】:

  • 这不是静态数组。它只是一个本地(堆栈分配)数组。

标签: c++ memory arrays memory-leaks


【解决方案1】:

内存会自动释放吗?

是的。如果您想知道,也会调用析构函数。这就是他们在automatic storage class 中的原因。

(实际上对于大多数架构,程序只会调用 100 个析构函数(如果有),然后将堆栈指针向后移动 100*sizeof(T) 字节作为“释放”。)

【讨论】:

  • 好的。感谢所有回复的人。我确信使用 new/delete,但有人给我的印象是我发布的内容不会被释放。在指针被删除(超出范围时),但它指向的数据仍处于分配状态(也无法访问)的情况下,您如何结束?
  • @MDonovin:见mmr的回答stackoverflow.com/questions/2758970/…
【解决方案2】:

在这种情况下,是的,内存被释放了。如果你做了类似的事情:

int var = 100;
char* c = new char[var];

然后,一旦函数结束,那将留在后面。

但是!您无需重新启动即可在现代操作系统上找回丢失的内存。相反,一旦进程(程序)结束,内存将被返回。

【讨论】:

    【解决方案3】:

    需要明确的是,这里并没有真正进行内存分配;正在发生堆栈分配。差异很大,因为前者需要函数调用、从分配系统中保留内存以及大量开销。相反,后者只涉及增加堆栈指针。堆栈分配总是快得多,而且除了涉及堆栈损坏的错误之外,总是在您的函数退出时被清理。

    【讨论】:

      【解决方案4】:

      没了——全没了。

      但是内存可以立即供下一个函数使用。堆栈只是作为指针实现,当您执行 c[100] 时,它将指针向下移动 100 字节,因此下一个请求的内存在 c 之后。当您离开函数时,堆栈指针只会移动回您进入函数之前的先前位置。与 new/delete/malloc 相比,这是一种非常快速有效的内存管理方式

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-26
        • 1970-01-01
        • 2013-11-15
        • 1970-01-01
        • 2017-02-20
        • 2019-10-21
        • 2016-03-14
        • 2021-10-13
        相关资源
        最近更新 更多