[编辑后的帖子,根据以前的答案和评论。我尝试了几种策略,其中没有一种有效。]
我有一个D类,有一个类型为E的成员变量.E有两个子类,E1和E2。当我尝试以下代码时,我遇到了分段错误(请参阅下面的详细输出)。有人可以告诉我为什么,并提供更改代码,使其工作?感谢。
欢迎任何有关可接受或专业编码风格的观察。
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
class E {
public:
E() {cout << "In E constructor" << endl;}
virtual ~E() {cout << "In E destructor" << endl;}
};
class E1 : public E {
public:
E1() {cout << "New E1" << endl;}
~E1() {cout << "In E1 destructor" << endl;}
};
class E2 : public E {
public:
E2() {cout << "New E2" << endl;}
~E2() {cout << "In E2 destructor" << endl;}
};
class D {
public:
D(const vector<int>& a, int b)
{
cout << "y1" << endl;
if (b == 1)
p = new E1();
else
p = new E2();
}
D() {cout << "y2" << endl; p = new E1();}
~D() {if (p != nullptr) {cout << "x" << endl; delete p;}}
private:
E *p;
};
int main(int argc, char **argv)
{
D d;
vector<int> a;
a.push_back(1);
int b = 2;
d = D(a, b);
}
这是输出。
y2
In E constructor
New E1
y1
In E constructor
New E2
x
In E2 destructor
In E destructor
x
Segmentation fault
答案 0 :(得分:0)
由于声明原因,您的原始代码正在删除新的E2对象。
d = D(a, b);
由于您未提供赋值运算符,因此编译器将提供成员赋值实现。分配后,变量 d 和从 D(a,b)创建的临时未命名变量将具有 p 成员变量指向同一个E2对象。
将在 d 和未命名变量上调用D ::〜D()析构函数。删除E2对象两次会导致分段错误。