【问题标题】:When a function ends are its local variables deallocated?当一个函数结束时,它的局部变量是否被释放?
【发布时间】:2014-03-16 23:26:27
【问题描述】:

如果不是,这是否意味着如果我想防止 100% 的内存泄漏,我必须通过删除所有局部变量来结束每个函数?

【问题讨论】:

  • 了解本地作用域对于“获得”C++ 至关重要。寻找包含 scopedestructor 字样的教程。

标签: c++ memory memory-leaks


【解决方案1】:

所有对象都有一个关联的存储期限。存储持续时间描述了对象的存储保留多长时间。非引用的局部变量会引入具有自动存储持续时间的对象,这意味着这些对象的存储在其作用域结束时会自动销毁。

引用类型变量不引入对象,甚至可能不需要存储它们自己,但它们仍然具有存储持续时间(第 3.7/3 节)。如果引用确实需要存储,则会根据引用的存储时长释放。

因此,任何类型的局部变量声明都不会泄漏。实际上,您不能delete 具有自动存储持续时间的对象。这仅用于具有动态存储持续时间的对象,这些对象使用new 分配。

【讨论】:

  • 这仍然让引用变量的情况保持开放。它们不是物体,但它们也不会引起韭菜。
  • @KerrekSB 指针和引用都不会导致韭菜;只有动态分配才能引起韭菜。但是如果你写MyType& var = *new MyType;之类的东西,你也可以用引用泄漏。
  • @JamesKanze:我意识到这一点。我指的是var 本身占用的空间。答案似乎没有涵盖它,因为var 不是对象。
  • @JamesKanze:我特别希望看到对 3.7/3 的引用。
  • @KerrekSB 添加了一个段落。感谢您强调它。
【解决方案2】:

在堆栈上分配的局部变量,即不使用内存分配函数或运算符,如mallocnew,会被自动删除。所有其他变量都必须使用 delete 删除,因为它们存储在堆上。

【讨论】:

  • 简单解释。谢谢!
【解决方案3】:

如果您手动分配内存,则必须在需要时将其删除,

例子:

char* foo()
{
    char* manually_allocated_char  = new char(); // this will 'live' outside the function
    char  autamically_allocated    = 'a'; // this will be 'deleted'
    return manually_allocated_char;
}


void main()
{
    char* a_new_char = foo();
    delete a_new_char; // You must free memory you have allocated for not having memory leaks
}

【讨论】:

  • 请注意,此示例仅用于说明;尽量不要正常地以这种方式编写代码。一般来说,尽量将news 和deletes 放在一起。如果您不能这样做并且绝对必须这样做,请评论评论评论!
  • 静态变量呢?他们在范围的尽头幸存下来。当不再需要它们时,我必须删除它们吗?
  • @MatheusRocha,这取决于,如果您希望函数“记住某些状态”最好保持原样(如果您使用 new 运算符),对于其他静态分配的变量而不使用 @ 987654325@没必要。
【解决方案4】:

必须删除使用 malloc、realloc、new 和 new[] 动态分配的内存。这些在堆内存中。其他人会被自动释放。

【讨论】:

  • 另请注意,当使用智能指针或 auto_ptr 时,您仍会使用 new 在堆上分配动态内存,但会自动为您管理清理工作。
  • 在这种情况下,使用mallocnew的真正优势是什么?
猜你喜欢
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 2016-06-13
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
相关资源
最近更新 更多