【问题标题】:Assigning a new object to a variable in a for loop in C++在 C++ 的 for 循环中将新对象分配给变量
【发布时间】:2012-04-26 21:42:42
【问题描述】:

希望这不是一个太基本的问题。我想知道做和做有没有区别

while (1) {
    int *a = new int(1);
    // Do stuff with a
}

相对于

int *a;
while (1) {
    a = new int(1);
    // Do stuff with a
}

在这两种情况下,动态分配相同数量的对象。但是在第一个示例中,在循环内部使用了 int 关键字这一事实会影响所使用的内存吗?

【问题讨论】:

  • 你在这里使用new有什么原因吗?
  • 我有一个需要动态分配对象的容器类。我也只是好奇。

标签: c++ performance memory-management


【解决方案1】:

区别在于范围

while (1) {
    int *a = new int(1);
    // Do stuff with a

    // Don't forget to delete a.
}

// Cannot access `a` here...

鉴于:

int *a;
while (1) {
    a = new int(1);
    // Do stuff with a

    // Don't forget to delete a.
}

// Can access `a` here.

您的两个示例中都有a memory leak。首选smart pointers

【讨论】:

  • 好的,我不确定在第一个示例中循环的每次迭代是否都重新创建了对 a 的引用。是的,它暗示 delete a 在 // Do stuff with a 中的某处。谢谢。
  • 我不认为这是暗示的。你真正想做的是什么?
  • 我被要求使用只接受动态分配对象的容器类。我很好奇变量a 发生了什么。在第二个示例中,使用了相同的引用,但在第一个示例中,我不确定是否在内存中创建了新的引用,而旧的引用会留在堆栈上,直到程序退出。根据您的说法,即使我将其重新声明为 int,也会使用相同的引用?
  • 在任一代码示例中都有 no references,只有 pointers。第一个在每次迭代时在堆栈上创建一个新的 pointer(尽管您的编译器可能会对此进行优化)。两个样本在堆上创建相同数量的ints(假设迭代次数相同)。
【解决方案2】:

它们本质上是相同的,并且几乎可以肯定会以相同的方式编译。即使他们不是,你进行堆分配的事实也比额外的堆栈更昂贵。

但更喜欢第一个,因为它的范围更窄。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2016-08-18
    • 2015-07-07
    相关资源
    最近更新 更多