该程序是否会导致内存泄漏

时间:2012-07-05 11:15:01

标签: c++ memory-leaks

我问我的朋友,在被这个帖子吸引之后,他是否可以在不使用循环或编码的情况下从1到1000进行打印:

Printing 1 to 1000 without loop or conditionals

他回答了这个程序。

#include <iostream>
using namespace std;

static int n = 1;

class f {
public:

    f() {
        cout << n++ << endl;
    }
};

int main(int argc, char *argv[]) {
    f n [1000];
}

运行程序输出正常。但是当我在netbeans上关闭程序时,它似乎仍在运行并消耗内存。该程序是否导致内存泄漏?并且有人可以解释这个小程序是如何工作的吗?

5 个答案:

答案 0 :(得分:9)

  

但是当我在netbeans上关闭程序时,它似乎仍在运行并消耗内存

当您关闭某个程序或它终止时,无论它是否有内存泄漏,内存都将被释放。我很确定你没有正确终止它。

  

程序是否导致内存泄漏?

不,如果您不使用newmalloc(直接或间接),则不会出现内存泄漏

  

有人可以解释这个小程序是如何运作的吗?

f n [1000];尝试创建1000个f个对象的向量。初始化后,调用构造函数,打印n并递增它。

答案 1 :(得分:3)

不,没有内存泄漏。

阵列使用自动存储,当它们超出范围时会自动释放。

通过new 使用动态存储会导致内存泄漏:

int main(int argc, char *argv[]) {
    new f[1000]; // this leaks
}
  

有人可以解释这个小程序是如何运作的吗?

构造数组会为数组的每个元素调用默认构造函数。所以f()被调用了1000次。

答案 2 :(得分:1)

您甚至不必关闭程序,它会自动终止。必须是您的IDE所做的事情,或者与您合作的任何事情。

它是如何工作的?类“f”有一个构造函数,它可以增加一个全局变量并输出它。他创建了一个包含1000个“f”实例的数组,这导致上述情况发生了1000次,对于数组中的每个“f”都会发生一次。

答案 3 :(得分:0)

无论何时完成

f n[i]

构造函数是f()被调用。因为每次调用全局变量都会递增。因此,对于从1到1000的f的每个对象,都会打印n的值。

关于内存泄漏,没有。该数组是一个局部变量,在程序结束时会被销毁。要启用动态分配,请使用new关键字。

答案 4 :(得分:0)

程序中没有明显的内存泄漏。您不会动态分配任何对象,也不会忘记发布任何内容。

您为数组n调用数组构造函数会发生什么。这本身就是把每个数组元素都称为构造函数f :: f()。因此,您获得输出。那么你有一个循环,但不是语言水平。