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

只要有测试用例一,程序运行没有错误,但如果我添加测试二,这个程序会有双重免费错误。不知道这个错误是怎么发生的?

4

3 回答 3

3

您只在额外测试中遇到问题的可能原因是它有一个新的内存分配。

许多 malloc/free new/delete 库会在双重释放期间破坏它们的数据结构。在下一次分配或释放操作之前,可能不会注意到这种损坏。这将是你的测试二。

一些库甚至可以正常运行。我相信某些版本的 Windows 实现了一个相当慢但健壮的内存堆处理程序作为兼容性选项,以免使有错误但幸运的旧软件崩溃。

于 2012-07-08T02:21:23.087 回答
2

Handle 的析构函数被调用了两次。它在_p 上调用delete。在这两种情况下,_p 都指向 a 的单个实例。双免了。

于 2012-07-08T02:13:59.937 回答
1

我不知道为什么你的一个测试会导致问题,而另一个不会。两者都是错误的。 Handle如果它没有分配指针,则不应释放指针。那只是自找麻烦。

于 2012-07-08T02:13:46.303 回答