-5


削除セマンティクスで予期しない動作が見られました。たとえば、次の C++ コードを使用します。

class Base{
    public:
         Base(int tmp) : x(tmp) {}
         ~Base() { std::cout << "Inside Base::~Base()" << std::endl; }
         void foo() { std::cout << "Inside Base::foo()" << std::endl; }
         int x;
};
...
int main(int argc, char** argv)
{
    Base* b = new Base(10);
    delete b;
    b->foo(); 
    std::cout << "b->x: " << b->x << std::endl;
}

Visual Studio 2008 から次の出力を受け取りました。

Inside Base::~Base()
Inside Base::foo()
b->x: 2359492

を呼び出した後でも、メソッドdelete bを呼び出すことができるのはなぜですか?Base::foo()

ありがとう、クリス

4

3 に答える 3

2

を呼び出した後でも、メソッドdelete bを呼び出すことができるのはなぜですか?Base::foo()

すべての未定義の動作と同様に、プログラムが適切に失敗する必要はないからです。

この場合、削除されたメモリにアクセスできなくなるという保証はありません。たとえそうであっても、非仮想メンバー関数を呼び出しても、そのメモリにアクセスする可能性はほとんどありません。そのため、プログラムがメンバー関数を呼び出す前にオブジェクトが有効かどうかを明確にチェックしない限り (これは非常にコストがかかるため、既定ではそれを行う実装はありません)、関数が期待どおりに呼び出され、バグが隠される可能性が常にあります。

于 2013-09-09T15:35:27.750 に答える
1

何かを削除すると、 によってリサイクルされますheap。これは、古い情報を削除した直後にアクセスしなかった場合、古い情報がそこにあるという保証がないことを意味します。アクセスしないように人々が言う理由は、それが何であるかを制御できないためです。このタイプの文字化けした出力は、変数の削除後に「予想される」未定義の動作です。

@LuchianGrigoreが言ったように、「やらないでください」!!!!!

于 2013-09-09T15:16:29.483 に答える