在push_back进入vector之后,对象立即被销毁

时间:2014-02-26 08:23:56

标签: c++ templates c++11

我不确定为什么会发生这种情况,但由于双析构函数调用,以下代码会产生运行时错误:

#include <iostream>
#include <vector>

using namespace std;

class base
{
    public:
        virtual ~base(){}
};

template<typename T>
class derived : public base {
    public:
    derived(const T& t_){}
};

class myClass
{
    public:
        template<typename T>
        myClass(const T& t) : data(new derived<T>(t)){}
        ~myClass(){delete data;}
    private:
        base* data;
};

int main() {


    vector<myClass> vec;

    myClass obj(22);

    vec.push_back(obj); // constructor is invoked and then destructor is invoked, why?


    return 0;
}

http://ideone.com/sLecwx

在将对象推入向量后立即调用“~myClass”析构函数。最初我想到了一个临时副本,但是因为构造函数被调用一旦它没有多大意义..如果在复制构造函数中我按值而不是通过引用获取对象,则会发生同样的情况

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:2)

您的MyClass既没有复制构造函数也没有赋值 操作;两者都是必要的。插入的对象 矢量是一个副本。默认的复制构造函数变浅 复制,这意味着两个实例最终都指向 同一个对象。考虑三个规则:如果您需要用户 定义析构函数,通常还需要用户定义的副本 构造函数和用户定义的赋值运算符。

答案 1 :(得分:1)

push_back接受对象的引用,但是当它插入到底层数组中时,无论如何都会创建该对象的副本。 这意味着调用了对象的复制构造函数,并且您实际上是将该对象的副本推送到向量。

当原始对象超出范围时,它将被销毁。