我不确定为什么会这样,但由于双重析构函数调用,以下代码会出现运行时错误:
#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;
}
将对象插入 vector 后立即调用“~myClass”析构函数。最初我想到了一个临时拷贝,但由于一旦构造函数被调用就没有多大意义。如果在复制构造函数中我按值而不是按引用获取对象,甚至会发生同样的情况
我是不是漏掉了什么?
最佳答案
您的 MyClass
既没有复制构造函数也没有赋值
运算符(operator);两者都是必要的。对象插入到
vector 是一个拷贝。默认的复制构造函数使一个浅表
复制,这意味着两个实例最终都指向
同一个对象。考虑三个规则:如果你需要一个用户
定义的析构函数,你通常还需要一个用户定义的拷贝
构造函数和用户定义的赋值运算符。
关于c++ - 对象在 push_back 进入 vector 后立即销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22035608/