1

g++ バージョンはg++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50)

私のテストコードは次のとおりです

    #include <iostream>
    using namespace std;

    class Handle{
    public:
            Handle(int *p, int u):_p(p),use(u){}
            ~Handle(){cout << "delete" << endl; delete _p;}
            void display(){cout << "value : " << *_p << ", use : " << use << endl;}
    private:
            int *_p;
            int use;
    };

    int main()
    {
        //Test case one
        {
        int *i = new int(10);

        Handle *h = new Handle(i, 2);
        Handle *h1 = new Handle(i, 100);

        h->display();
        h1->display();

        delete h;
        delete h1;
        //call ~Handle() two times, means free double times, why don't runtime error??
        }

        //Test case two
        {
            int *a = new int(11);
            Handle h2(a, 23);
            Handle h3(a, 33);

            h2.display();
            h3.display();

            //in this case, will double free error
        }
        cout << "ok" << endl;
        return 0;
    }

テスト ケース 1 だけでは、プログラムはエラーなしで実行されますが、テスト 2 を追加すると、このプログラムにはダブル フリー エラーが発生します。このエラーがどのように発生するのかわかりませんか?

4

3 に答える 3

3

余分なテストでのみ問題が発生する理由として考えられるのは、新しいメモリ割り当てが含まれていることです。

多くの malloc/free new/delete ライブラリは、二重解放中にデータ構造を破壊します。この破損は、次の割り当てまたは解放操作まで気付かれない場合があります。これがテスト 2 になります。

一部のライブラリは、エラーなしで実行されることさえあります。Windows の一部のバージョンでは、バグがあっても運が良かった古いソフトウェアをクラッシュさせないように、互換性オプションとしてかなり遅いが堅牢なメモリ ヒープ ハンドラーを実装していると思います。

于 2012-07-08T02:21:23.087 に答える
2

Handle のデストラクタが 2 回呼び出されます。_p で delete を呼び出します。どちらの場合も、_p は a の単一のインスタンスを指しています。のダブルフリー。

于 2012-07-08T02:13:59.937 に答える
1

テストの 1 つが問題を引き起こし、もう 1 つが問題を引き起こさない理由がわかりません。どちらも間違っています。 Handleポインターを割り当てていない場合は、ポインターを解放しないでください。それはただトラブルを求めているだけです。

于 2012-07-08T02:13:46.303 に答える