向量正在调用析构函数,即使在推回的时刻也是如此..为什么?

vector is calling the destructor even at the moment of push back... why

本文关键字:时刻 为什么 析构函数 调用 向量      更新时间:2023-10-16

我在这段代码中注意到了一些东西。即使在推回向量中的元素时也是如此(请参见函数passtoit)。正在调用结构测试的析构函数。谁能给我解释一下吗。。为什么会有这种行为。。。

当我声明静态对象的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;
    }

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

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

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

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

若要检查它的实际工作方式,请尝试在类的私有作用域中重写复制构造函数。push_back函数将不会被调用,您将得到编译器错误。

首先,当向量被取消构造时,它会破坏每个元素。

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

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

在表达式语句的末尾(即分号处),或在for、if、while、do和switch语句的控制表达式的末尾销毁所有作为表达式求值结果创建的临时性

请参阅:临时对象

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

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