C++ 为什么不在我的c++;密码

C++ 为什么不在我的c++;密码,c++,double-free,C++,Double Free,g++版本是g++(GCC)4.1.220080704(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;

g++版本是
g++(GCC)4.1.220080704(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;
    }
#包括
使用名称空间std;
类句柄{
公众:
句柄(int*p,intu):_p(p),使用(u){

~Handle(){cout我不知道为什么您的一个测试会导致问题,而另一个不会。两者都是错误的。
Handle
如果没有分配指针,就不应该释放指针。这只是自找麻烦。

我不知道为什么您的一个测试会导致问题,而另一个不会。两者都是错误的。
Handle
不应该如果指针没有分配指针,则重新生成指针。这只是自找麻烦。

句柄的析构函数被调用两次。它在\u p上调用delete。在这两种情况下,p都指向a的单个实例。Double free a。

句柄的析构函数被调用两次。它在\u p上调用delete。在这两种情况下,p都指向singa.Double的le实例没有a.

额外测试出现问题的可能原因是它有一个新的内存分配

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


有些库甚至可以无误运行。我相信,某些版本的Windows实现了一个相当缓慢但健壮的内存堆处理程序,作为一个兼容性选项,以便不会使有bug但运气好的旧软件崩溃。

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

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


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

您说
~Handle
被调用了三次,但只会被调用两次。也许您应该包括取消输出。您说,
~Handle
被调用了三次,但只会被调用两次。也许您应该包括输出。