c++ - 对象在 push_back 进入 vector 后立即销毁

标签 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

将对象插入 vector 后立即调用“~myClass”析构函数。最初我想到了一个临时拷贝,但由于一旦构造函数被调用就没有多大意义。如果在复制构造函数中我按值而不是按引用获取对象,甚至会发生同样的情况

我是不是漏掉了什么?

最佳答案

您的 MyClass 既没有复制构造函数也没有赋值 运算符(operator);两者都是必要的。对象插入到 vector 是一个拷贝。默认的复制构造函数使一个浅表 复制,这意味着两个实例最终都指向 同一个对象。考虑三个规则:如果你需要一个用户 定义的析构函数,你通常还需要一个用户定义的拷贝 构造函数和用户定义的赋值运算符。

关于c++ - 对象在 push_back 进入 vector 后立即销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22035608/

相关文章:

C++ 写入和读取 mysql 数据库

c++ - 函数调用歧义(用户自定义转换和Derived2Base指针转换)

c++ - 具有默认值的模板别名

c++ - HP-35计算器基本功能代码

c++ - 内存池背后的常见实现细节是什么?

c++ - 在 1 条语句中将自定义函数作为模板参数传递

c++ - 以派生类作为参数的专用模板方法

templates - Dojo 和模板解决方案

c++ - 带有 Vector3 键的 std::map 与使用复合索引的 std::vector

c++ - 如何在一个switch中实现多个case的一些独占语句和一些公用语句?