2
class X {
public:
    X(int i) : num(i){}
    int num;
};

void f(int i){

    static X* px1 = new X(i);
    X* px2 = new X(i);
    cout<<px1->num;
    cout<<px2->num<<' ';

};

void main(){
    for (int i=0;i<5;i++) 
        f(i);
}

このコードは を出力しますが、静的ポインタが を使用して値を変更できない00 01 02 03 04理由がよくわかりません。px1operator new

また、このコードにはメモリリークの問題があります。deleteと一緒に使えますpx1か? 両方のポインターを使用deleteすると、メモリ リークの問題が解決しますか?

4

2 に答える 2

12

これは、制御が最初に初期化コードを通過するときに、静的ローカルが 1 回だけ初期化されるためです。したがって、次の行で関数を複数回呼び出しますが:

static X* px1 = new X(i);

最初の呼び出し (iゼロ) でのみ実行され、変数は関数呼び出し間でその値を保持します。

はい、できますがdelete px1、ダブルフリーや未定義の動作を避けるために、後で null に設定することをお勧めします。が指しているオブジェクトにもリークがありますpx2-それらのオブジェクトにも注意する必要があります。

于 2012-08-21T13:24:55.083 に答える
4

しかし、静的ポインター px1 が演算子 new を使用してその値を変更できない理由がよくわかりません

静的ローカルは、最初に呼び出されたときに初期化されます。

両方のポインターで削除を使用すると、メモリリークの問題が解決しますか?

はい

std::unique_ptrこの場合、生のポインターの代わりに使用することをお勧めしますdelete。自動でdeleteやってくれるので漏れません。

さらに、どちらの割り当てもヒープに割り当てる必要はありません。通常new、オブジェクトが作成されたスコープの外にオブジェクトを永続化する場合にのみ使用します。この場合、その必要がないため、次のように記述できます。

static X x1(i);
X x2(i);
cout<<x1.num;
cout<<x2.num<<' ';
于 2012-08-21T13:26:50.183 に答える