我问我的朋友,在被这个帖子吸引之后,他是否可以在不使用循环或编码的情况下从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上关闭程序时,它似乎仍在运行并消耗内存。该程序是否导致内存泄漏?并且有人可以解释这个小程序是如何工作的吗?
答案 0 :(得分:9)
但是当我在netbeans上关闭程序时,它似乎仍在运行并消耗内存
当您关闭某个程序或它终止时,无论它是否有内存泄漏,内存都将被释放。我很确定你没有正确终止它。
程序是否导致内存泄漏?
不,如果您不使用new
或malloc
(直接或间接),则不会出现内存泄漏
有人可以解释这个小程序是如何运作的吗?
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()。因此,您获得输出。那么你有一个循环,但不是语言水平。