带有指针变量的C ++分段错误类

时间:2015-01-13 01:26:40

标签: c++

[编辑后的帖子,根据以前的答案和评论。我尝试了几种策略,其中没有一种有效。]

我有一个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

1 个答案:

答案 0 :(得分:0)

由于声明原因,您的原始代码正在删除新的E2对象。

   d = D(a, b);

由于您未提供赋值运算符,因此编译器将提供成员赋值实现。分配后,变量 d 和从 D(a,b)创建的临时未命名变量将具有 p 成员变量指向同一个E2对象。

将在 d 和未命名变量上调用D ::〜D()析构函数。删除E2对象两次会导致分段错误。