• 出队列,调用pop_front会不会删除并销毁队头元素


    问题背景:
    while(!AQueue.empty())
    {
        AType *pa = AQueue.front();
        xxx_free(pa->element);//这里是调用私有的free完成必要的释放
        delete pa;
        AQueue.pop_front();
    }
    
    针对上述的实现,有个疑问:pop_front会不会删除并销毁队头元素?自
    己delete后,再调用pop_front不是会重复释放?
    
    
    试验程序:myqueue.cpp
    #include <iostream>
    #include <queue>
    
    class A
    {
    public:
    
        A(){std::cout << "A constructor " << '
    ';}
        ~A(){std::cout << "A destructor " << '
    ';}
    
        void fun();
    };
    
    void A::fun()
    {
        std::cout << "A::fun()" << '
    ';
    }
    
    
    int main()
    {
        std::queue<A> myqueue;
        A a1;
        A a2;
        myqueue.push(a1);
        myqueue.push(a2);
    
        a1.fun();
        a2.fun();
    
        myqueue.pop();
        a1.fun();
        a2.fun();
    
       return 0;
    }
    
    编译:g++ -g -Wall -std=c++11 myqueue.cpp
    
    打印:
    A constructor
    A constructor
    A::fun()
    A::fun()
    A destructor
    A::fun()
    A::fun()
    A destructor
    A destructor
    A destructor
    
    
    实验一:修改程序如下
    #include <iostream>
    #include <queue>
    
    class A
    {
    public:
    
        A(){std::cout << "A constructor " << '
    ';}
        ~A(){std::cout << "A destructor " << '
    ';}
    
        void fun();
    };
    
    void A::fun()
    {
        std::cout << "A::fun()" << '
    ';
    }
    
    
    int main()
    {
        std::queue<A> myqueue;
        A a1;
        //A a2;
        myqueue.push(a1);
        //myqueue.push(a2);
    
        //a1.fun();
        //a2.fun();
    
        myqueue.pop();
        a1.fun();
        //a2.fun();
    
       return 0;
    }
    
    
    打印:
    A constructor
    A destructor
    A::fun()
    A destructor
    
    
    实验二:修改程序如下
    #include <queue>
    
    class A
    {
    public:
    
        A(){std::cout << "A constructor " << '
    ';}
        ~A(){std::cout << "A destructor " << '
    ';}
    
        void fun();
    };
    
    void A::fun()
    {
        std::cout << "A::fun()" << '
    ';
    }
    
    
    int main()
    {
        std::queue<A*> myqueue;
        A *pa1 = new A();
    
        myqueue.push(pa1);
        std::cout << "myqueue push pa1" << '
    ';
    
        myqueue.pop();
    
        pa1->fun();
    
       return 0;
    }
    
    
    打印:
    A constructor
    myqueue push pa1
    A::fun()
    //上面的实验二有内存泄漏,并且没有调用析构函数
    
    
    实验三:修改程序如下
    #include <iostream>
    #include <queue>
    
    class A
    {
    public:
    
        A(){std::cout << "A constructor " << '
    ';}
        ~A(){std::cout << "A destructor " << '
    ';}
    
        void fun();
    };
    
    void A::fun()
    {
        std::cout << "A::fun()" << '
    ';
    }
    
    
    int main()
    {
        std::queue<A*> myqueue;
        A *pa1 = new A();
    
        myqueue.push(pa1);
        std::cout << "myqueue push pa1" << '
    ';
    
        std::cout << "before pop myqueue.size()=" << myqueue.size() << '
    ';
        myqueue.pop();
        std::cout << "after pop myqueue.size()=" << myqueue.size() << '
    ';
    
        pa1->fun();
    
        if(pa1 != nullptr)
        {
            std::cout << "delete pa1" << '
    ';
            delete pa1;
            pa1 = nullptr;
        }
       return 0;
    }
    
    
    打印:
    A constructor
    myqueue push pa1
    before pop myqueue.size()=1
    after pop myqueue.size()=0
    A::fun()
    delete pa1
    A destructor
    
    
    
    实验四:修改程序如下
    #include <iostream>
    #include <queue>
    
    class A
    {
    public:
    
        A(){std::cout << "A constructor " << '
    ';}
        ~A(){std::cout << "A destructor " << '
    ';}
    
        void fun();
    };
    
    void A::fun()
    {
        std::cout << "A::fun()" << '
    ';
    }
    
    
    int test()
    {
        std::queue<A*> myqueue;
        A *pa1 = new A();
    
        myqueue.push(pa1);
        std::cout << "myqueue push pa1" << '
    ';
    
        std::cout << "before pop myqueue.size()=" << myqueue.size() << '
    ';
        myqueue.pop();
        std::cout << "after pop myqueue.size()=" << myqueue.size() << '
    ';
    
        pa1->fun();
    
        /*if(pa1 != nullptr)
        {
            std::cout << "delete pa1" << '
    ';
            delete pa1;
            pa1 = nullptr;
        }*/
       return 0;
    }
    
    int main()
    {
        test();
    
        std::cout << "test out" << '
    ';
        return 0;
    }
    
    打印:
    A constructor
    myqueue push pa1
    before pop myqueue.size()=1
    after pop myqueue.size()=0
    A::fun()
    delete pa1
    A destructor
    test out
    

      

  • 相关阅读:
    更改eclipse(myeclipse) author的默认名字(注释的作者)
    Myecplise Tomcat 启动很慢
    Java Enum 比较用 == 还是 eques
    Spring JDBC查询返回对象代码跟踪
    Apache启动失败(Windows 无法在本地计算机启动Apache2.2)
    SQLServer2008 统计表占用空间
    SET IDENTITY_INSERT ON/OFF 权限
    字母出现频率
    统计单词数
    查找最大元素
  • 原文地址:https://www.cnblogs.com/liangzige/p/15353216.html
Copyright © 2020-2023  润新知