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];
}

プログラムを実行すると、OK が出力されます。しかし、netbeans でプログラムを閉じると、まだ実行中でメモリを消費しているようです。プログラムがメモリリークを引き起こしていますか? そして、誰かがこの小さなプログラムがどのように機能するかを説明できますか?

4

5 に答える 5

9

しかし、ネットビーンズでプログラムを閉じると、まだ実行中でメモリを消費しているようです

プログラムを閉じるか終了すると、メモリ リークの有無に関係なく、メモリは解放されます。正しく終了していないと確信しています。

プログラムがメモリリークを引き起こしていますか?

いいえ、 (直接的または間接的に) ornewを使用しない場合、メモリ リークは発生しません。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
}

そして、誰かがこの小さなプログラムがどのように機能するかを説明できますか?

配列を作成すると、配列の各要素の既定のコンストラクターが呼び出されます。1000f()回呼び出されているだけです。

于 2012-07-05T11:17:31.153 に答える
1

プログラムを閉じる必要さえありません。自動的に終了します。IDE が行うもの、または使用するものである必要があります。

使い方?クラス「f」には、グローバル変数を増やして出力するコンストラクタがあります。彼は "f" のインスタンスを 1000 個含む配列を作成します。これにより、配列内の "f" ごとに 1 回、上記のことが 1000 回発生します。

于 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 に答える