【问题标题】:Simple memory issue exercise简单的记忆问题练习
【发布时间】:2013-02-08 05:58:02
【问题描述】:

我主要使用高级编程语言,但是所以昨天一个朋友让我帮他解决一个简单的 C++ 练习,在我做的时候我写了这段代码:

for (int x = 0; x < 10; x++){
    int a, b, c;
    a = x;
    b = x*2;
    c = x+5;
}

我的问题是:这会导致内存泄漏,使 a、b、c 总是在不同的内存位置创建,还是每次循环都会覆盖它们?

【问题讨论】:

  • 您问的是 C 还是 C++?请选择一个并删除另一个标签。
  • @Robᵩ - C 和 C++ 的答案是一样的:不。

标签: c++ memory-management memory-leaks


【解决方案1】:

abc 将在堆栈上分配。除非类型本身通过其构造函数和/或析构函数导致泄漏,否则自动变量永远不会导致内存泄漏。

关于它们是否会覆盖每个循环的问题:我强烈怀疑地球上的每个编译器都会这样做,但原则上,这并不能保证。如果您查看汇编输出,您会发现(a)所有变量都在寄存器中,或者(b)它们作为堆栈指针的固定偏移量检索。由于每次循环都在执行相同的程序集,因此它们确实会被覆盖。

【讨论】:

  • 如果它们在内部动态分配资源并且不在其析构函数中释放它们,或者没有其他机制来释放资源,它们可能会泄漏。
  • @juanchopanza:如果我们假设 Class 设计正确。然后它们在用作自动变量时不会泄漏。
【解决方案2】:

如果你创建一个这样的变量

int i = 5;

编译器会将它们放入堆栈中,您不必释放 int。 但是,如果您在堆上创建一个 int,

int* i = new int; /*C++ style*/
int* j= (int*) malloc(sizeof(int)); /*C style*/

你确实已经像这样释放内存:

delete i; /*C++ style*/
free(j); /*C style*/

否则会出现内存泄漏。 最重要的是,您不想混合使用 c 和 c++ 风格的内存处理。

【讨论】:

  • 堆/堆栈这些术语在描述 C++ 时没有用处。您想要的术语是“自动存储”和“动态存储”。见stackoverflow.com/q/6403055/14065
  • @Loki Astari 感谢您提供的信息,我目前不知道这一点。
【解决方案3】:

你问了三个问题:

这会导致内存泄漏

不,这里没有内存泄漏。内存泄漏,正如该术语通常使用的那样,需要一个没有deletenew,一个没有delete[]new[],或者一个没有free()malloc()

a、b、c 总是在不同的内存位置创建

他们可能是。他们可能不是。这是您的程序不需要知道的实现细节。您只需要知道对象是在定义它们的行创建的,并在该范围的右大括号处销毁。

每次循环都会覆盖它们?

他们可能是。他们可能不是。这是您的程序不需要知道的实现细节。不管它们是否被覆盖,它们在每次循环中都会被销毁。

【讨论】:

    【解决方案4】:

    在循环的每次迭代中,内存中的相同位置将用于存储abc 中的值。

    【讨论】:

      【解决方案5】:

      只有在动态分配变量时才会发生内存泄漏(通过调用newnew []malloccalloc)。您的代码中没有,所以NO

      您拥有的是本地或自动变量。顾名思义,自动变量在创建它们的范围 {} 结束时被隐式释放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多