我不确定为什么会发生这种情况,但由于双析构函数调用,以下代码会产生运行时错误:
#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;
}
在将对象推入向量后立即调用“~myClass”析构函数。最初我想到了一个临时副本,但是因为构造函数被调用一旦它没有多大意义..如果在复制构造函数中我按值而不是通过引用获取对象,则会发生同样的情况
我在这里错过了什么吗?答案 0 :(得分:2)
您的MyClass
既没有复制构造函数也没有赋值
操作;两者都是必要的。插入的对象
矢量是一个副本。默认的复制构造函数变浅
复制,这意味着两个实例最终都指向
同一个对象。考虑三个规则:如果您需要用户
定义析构函数,通常还需要用户定义的副本
构造函数和用户定义的赋值运算符。
答案 1 :(得分:1)
push_back接受对象的引用,但是当它插入到底层数组中时,无论如何都会创建该对象的副本。 这意味着调用了对象的复制构造函数,并且您实际上是将该对象的副本推送到向量。
当原始对象超出范围时,它将被销毁。