0

我问我的朋友,他是否可以在不使用循环或附加语句的情况下从 1 打印到 1000,因为他对这个线程很感兴趣:

打印 1 到 1000 不带循环或条件

他回答了这个程序。

#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 上的程序时,它似乎仍在运行并消耗内存。程序是否导致内存泄漏?有人能解释一下这个小程序是如何工作的吗?

4

5 回答 5

9

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

当你关闭一个程序或者它终止时,不管它是否有内存泄漏,内存都会被释放。我很确定您没有正确终止它。

程序是否导致内存泄漏?

不,如果不使用newor malloc(直接或间接) ,就不会发生内存泄漏

有人能解释一下这个小程序是如何工作的吗?

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

于 2012-07-05T11:17:32.117 回答
3

不,没有内存泄漏。

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

但是,使用动态存储new 导致内存泄漏:

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

有人能解释一下这个小程序是如何工作的吗?

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

于 2012-07-05T11:17:31.153 回答
1

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

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

于 2012-07-05T11:19:00.623 回答
0

每当这样做

f n[i]

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

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

于 2012-07-05T11:18:51.650 回答
0

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

实际发生的是您调用数组 n 的数组构造函数。这本身就将每个数组元素称为构造函数 f::f()。因此你得到了输出。那么你有一个循环,但不是在语言级别。

于 2012-07-05T11:20:33.063 回答