0

私はこのコードを持っています:

class A {
    public:
            int x;
};

A *b;

void x() {
    A a;
    A *b = new A();
//  delete b; // works. free b.
}

int main() {
    x();
    delete b; //not. why ?
    return 0;
}

なぜ b は x() 内でしか解放できないのですか? main() ではない?b は手動変数であり、スコープにバインドされていないと思いました。valgrind で確認しました。

ありがとうございました。:)

アップデート:

今思い出した。グローバル b を次のように使用できます。

b = 新しい A();

次に、main() の delete b により、グローバル b を適切に削除できます。

*フェイスパーム*

4

4 に答える 4

6

binsideの宣言はグローバル宣言をx() 隠しているためです。それは別の変数です。したがって、コードではグローバルbが割り当てられないため、メモリリークが発生します。

于 2013-02-05T12:22:57.433 に答える
2

この方法で外側を操作できますb

 ::b;

function 内で、グローバルに表示x()される new を宣言しました。outter で操作したい場合は、提供できます。bbscope resolution notation ::b

于 2013-02-05T12:23:10.163 に答える
1

あなたの関数x()では、ローカル変数を宣言していますb。この変数はグローバル変数とは無関係ですb

delete binmain()は、グローバル ポインターを削除しようとしますb(グローバル ポインターは null ポインター値に初期化されるため、delete何もしません)。

于 2013-02-05T12:24:03.410 に答える
0

b内部はグローバルスコープxとは異なります。b「手動」変数がどうあるべきかはわかりませんが、C++ は (すべての実用的な目的のために) レキシカル スコープです。したがって、新しい変数は、より高いスコープ レベルで変数を隠します。

于 2013-02-05T12:24:33.577 に答える