C++ 物体被推回后立即销毁';d转换成向量

C++ 物体被推回后立即销毁';d转换成向量,c++,templates,c++11,C++,Templates,C++11,我不确定为什么会发生这种情况,但由于双重析构函数调用,以下代码给出了一个运行时错误: #include <iostream> #include <vector> using namespace std; class base { public: virtual ~base(){} }; template<typename T> class derived : public base { public: derive

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

#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;
}
#包括
#包括
使用名称空间std;
阶级基础
{
公众:
虚拟~base(){}
};
模板
派生类:公共基{
公众:
导出的(常数T&T{}
};
类myClass
{
公众:
模板
myClass(常量T&T):数据(新派生的(T)){}
~myClass(){删除数据;}
私人:
基础*数据;
};
int main(){
向量向量机;
myClass obj(22);
vec.push_back(obj);//调用构造函数,然后调用析构函数,为什么?
返回0;
}

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


我在这里遗漏了什么吗?

push\u获取对对象的引用,但在将该对象插入到基础数组中时,仍然会创建该对象的副本。 这意味着调用了对象的复制构造函数,实际上您正在将该对象的副本推送到向量


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

push_back获取对对象的引用,但在将对象插入基础数组时,仍然会创建该对象的副本。 这意味着调用了对象的复制构造函数,实际上您正在将该对象的副本推送到向量


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

push_back获取对对象的引用,但在将对象插入基础数组时,仍然会创建该对象的副本。 这意味着调用了对象的复制构造函数,实际上您正在将该对象的副本推送到向量


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

push_back获取对对象的引用,但在将对象插入基础数组时,仍然会创建该对象的副本。 这意味着调用了对象的复制构造函数,实际上您正在将该对象的副本推送到向量


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

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

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

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

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

Google“rule of three”查找为什么必须编写
运算符=(const myClass&)和一个复制构造函数
myClass(const myClass&)
和C++11的“五个规则”。或者在本例中,零规则,如何通过为成员选择更好的类型来避免编写所有这些。谷歌“三个规则”来找出为什么必须编写
操作符=(const myClass&)和一个复制构造函数
myClass(const myClass&)
和C++11的“五个规则”。或者在本例中,零规则,如何通过为成员选择更好的类型来避免编写所有这些。谷歌“三个规则”来找出为什么必须编写
操作符=(const myClass&)和一个复制构造函数
myClass(const myClass&)
和C++11的“五个规则”。或者在本例中,零规则,如何通过为成员选择更好的类型来避免编写所有这些。谷歌“三个规则”来找出为什么必须编写
操作符=(const myClass&)和一个复制构造函数
myClass(const myClass&)
和C++11的“五个规则”。或者在本例中,零规则,即如何通过为成员选择更好的类型来避免编写所有这些内容。
push_back
通过引用而不是值获取其参数。然而,我们制作了一份副本。你应该提到
向后放置
。C++11还为可移动插入的类型定义了
push_-back(T&&value)
。@EdS。由于他有一个构造的实例,
emplace_-back
实际上并不相关。当然,它只是C++11,这意味着大多数人还不能使用它。(另一方面,答案确实应该提到三的规则。)@EdS.push_back通过引用进入push_back()方法本身。没有隐式临时对象并不意味着其他地方没有副本。复制到向量本身。@JamesKanze:m