当我不遵守指针时,为什么我的C ++向量使用空指针。

时间:2017-11-18 05:19:19

标签: c++ oop pointers vector polymorphism

我正在开发一个c ++面向对象项目。我在我的ListOfShapes类中将向量定义为私有变量:

    vector<Shape*> list_of_shapes = {};

Shape是另一个类,下面是它的头文件:

class Shape{
private:
    string color;//private variable
public:
    Shape(string c);//non-default constructor
    string getColor();//returns color of the object
    virtual void print() = 0;//pure virtual "print" function
};

Shape是名为Rectangle的类的父类:

class Rectangle:public Shape{
public:
    Rectangle(const string &c,double length,double breadth);
    void print();
private:
    double length, breadth;

};

在main函数中,我创建了一个ListOfShapes对象,该对象包含一个将指针(指向Shape对象)推入上面提到的向量的函数。以下是被调用函数的实现:

void ListOfShapes::addShape(Shape* s) {
    list_of_shapes.push_back(s); 
}

最后这里是调用main函数的动作:

int main() {
    ListOfShapes* list;
    Shape* r;
    r = new Rectangle( "red",1,1);
    list->addShape( r);
    return 0;
}

如果我尝试在main函数中创建相同的向量(存储指向Shape的指针),我的代码编译得很好甚至可以运行。问题发生在addShape方法中,当调用vector类中的push_back方法时,由于某种原因它使用空指针。我花了好几个小时试图解决这个问题,但我似乎无法找到原因。 我得到的错误是:

Debugger output

1 个答案:

答案 0 :(得分:1)

您正在访问未初始化的指针list

int main() {
    ListOfShapes* list;
    Shape* r;
    r = new Rectangle( "red",1,1);
    list->addShape( r);  // <-- list is not initialized, thus undefined behavior
    return 0;
}

如果查看调试器输出,您会发现this函数中addShape有一个奇怪的值。这表示对象本身无效,并且在无效对象内完成的任何操作也无效。

只需创建一个list本地对象。不需要指针:

int main() {
    ListOfShapes list;
    Shape* r;
    r = new Rectangle( "red",1,1);
    list.addShape( r);
    return 0;
}

此外,您的Shape类应该有一个虚拟析构函数。如果您通过迭代delete尝试list存储在list中的对象,则由于Shape没有虚拟析构函数,程序将调用未定义的行为。