即使在推回的那一刻,vector也在调用析构函数...为什么

时间:2014-08-25 06:10:18

标签: c++ vector

我在这段代码中注意到了一些东西。即使在向后推回向量中的元素时(参见函数passtoit)。正在调用struct test的析构函数。任何人都可以向我解释一下..为什么会有这种行为......

当我声明静态对象的std::vector并让它运行时,它给出了我的堆损坏问题,并且当我将测试声明为测试指针(*)的std::vector并删除该指针时如图所示在评论代码中,它工作正常。请解释 。它会帮助我很多。我不知道还有什么要写在这里,以使stackworkflow了解它是有效的问题

    #include "stdafx.h"
    #include <vector>
    #include <iostream>
    #include <vld.h>
    using namespace std;

    class declaration
    class testHelper
    {
    public:
        testHelper(int passed):m(passed){}

        int m;

        ~testHelper(){cout<<"deleting as thought";}
    };
     declaration of structure 
    struct test
    {
       // constructor
        test(string name,testHelper* help):name(name),dummy(help){}

        string name;

        testHelper *dummy;
    // destructor
        ~test()
        {
            cout<<"deleting dummy";

            if(dummy!=NULL)

            {
                delete dummy;

                dummy =NULL;
            }
        }
    };

    function to pass 
    int passtoit()
    {
        std::vector<test> x;
        // push back on the vector
        x.push_back(test("prakash",(new testHelper(10))));

        //for(std::vector<test>::iterator i =x.begin();i!=x.end();++i)

        //{

        //    delete *i;

        //}

        return 0;
    }
      main function
    int _tmain()
    {
        // calling the function
        passtoit();

        return 0;

    }

3 个答案:

答案 0 :(得分:1)

使用std::vector<test>时,元素被复制到矢量中。

x.push_back(test("prakash",(new testHelper(10))));

您正在创建一个被复制然后立即销毁的实例。

答案 1 :(得分:0)

当我们使用push_back向向量插入元素时,将调用复制构造函数,然后为arguement对象创建一个临时对象,然后将其插入到向量中。然后销毁/删除临时对象。

要检查它的实际工作方式,请尝试在该类的私有范围内覆盖复制构造函数。将不会调用push_back函数,您将收到编译器错误。

答案 2 :(得分:0)

首先,当矢量被解构时,它会摧毁每一个元素。

template<class _Ty> inline
    void _Destroy(_Ty _FARQ *_Ptr)
    {   // destroy object at _Ptr
    _DESTRUCTOR(_Ty, _Ptr);
    }
#define _DESTRUCTOR(ty, ptr)    (ptr)->~ty()

其次,您应该知道临时对象何时被销毁。

&#34;由于表达式求值而创建的所有临时值都在表达式语句的末尾(即分号)或for的控制表达式的末尾被销毁,if,while,do和切换语句。&#34;

看到这个: Temporary Objects

所以,原因是dummy指向的内存被删除了两次。 为避免这种情况,您应该覆盖operator =

test& operator=(const test& t)
    {
        if(this == &t)
            return *this;
        name = t.name;
        dummy = new testHelper(*t.dummy);
        return *this;
    }