【问题标题】:do for loops deallocate memory after they finishdo for 循环在完成后释放内存
【发布时间】:2022-01-18 06:15:52
【问题描述】:

假设你写了一个 for 循环:

for (int i = 0; i < 10; i++)
   for (int j = 0; j < 10; j++)

for 循环是否创建了 10 个不同的 j 变量,它是否在完成循环后释放 ij

我见过很多人这样做:

int i, j, k

for (i = 0; i < 10; i++)
   for (j = 0; j < 10; j++)
//..All The Loops..//

在所有循环之前声明 i j k 变量有什么好处,还是只是个人喜好?

【问题讨论】:

  • 我觉得你应该看看这个帖子stackoverflow.com/questions/7880658/…
  • C 源代码中变量声明的位置与编译器实际分配该变量的时间关系不大。实际上,它会在使用这些变量之前的某个时间为这些变量保留寄存器或堆栈空间,然后一遍又一遍地重复使用相同的寄存器/堆栈空间。

标签: c++ c for-loop memory-management


【解决方案1】:

所有有问题的变量都在automatic storage 中创建。他们在去out of scope时被摧毁。这两个例子只是声明了不同作用域的变量。

在第一个示例中,i 的作用域是外循环,这意味着 i 仅在循环运行时存在。循环开始时创建,循环结束时销毁:

for (int i = 0; i < 10; i++) { <- created here
    <statements>
} <- destroyed here

与内循环中的j 相同:

for (int i = 0; i < 10; i++) { <- i created here
    for (int j = 0; j < 10; j++) { <- j created here
       <statements>
    } <- j destroyed here
} <- i destroyed here

在第二个例子中,变量的作用域是循环所在的外部块。因此变量在外部循环开始之前就已经存在,并且在循环结束后它们继续存在。

{
    ...
    int i, j, k; <- created here

    for (i = 0; i < 10; i++)
        for (j = 0; j < 10; j++)
           ...

    ...
} <- destroyed here

【讨论】:

  • 在 C 中,作用域和生命周期是正交的。我承认这种区别可能看起来很迂腐,尤其是对于初学者来说,但它是真实的。
  • 因此,在cc++ 中将它们声明在循环之外没有任何优势,它们会在花括号结束时被删除。如果我正确理解了答案。
  • @Pixel Paras:如果你需要在 for 循环结束后迭代变量的最后一个值,那么你必须在循环之前/之外声明它。
【解决方案2】:

for (int i = 0; i &lt; 10; i++) 只能在 C99 或 C11 模式下使用,这是一种更现代的风格。

在使用非常旧的编译器时,您应该在使用之前声明i

【讨论】:

  • 这不是答案,而是评论。你有 51 声望,所以你现在可以发表评论了。
  • @Jabberwocky:我不同意,这回答了第二个问题。以前的贴花不是静止的,而是旧标准的必需品。 (因此有些人继续使用旧方法)。
猜你喜欢
  • 2019-09-12
  • 1970-01-01
  • 2012-07-04
  • 2014-05-24
  • 2018-12-02
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多