为什么我的C++向量在不遵守指针时使用空指针。
问题描述:
我正在开发一个C++对象方向项目。我定义了一个向量作为我ListOfShapes类私有变量:为什么我的C++向量在不遵守指针时使用空指针。
vector<Shape*> list_of_shapes = {};
形状是另一个类,以下是它的头文件:
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
};
形状是父类的类名为矩形:
class Rectangle:public Shape{
public:
Rectangle(const string &c,double length,double breadth);
void print();
private:
double length, breadth;
};
在主函数创建其中包含推压的指针(指向Shape对象)进入我上面提到的载体的功能的ListOfShapes对象。下面是调用函数的实现:
void ListOfShapes::addShape(Shape* s) {
list_of_shapes.push_back(s);
}
最后在这里呼吁在主函数的作用:
int main() {
ListOfShapes* list;
Shape* r;
r = new Rectangle("red",1,1);
list->addShape(r);
return 0;
}
我的代码编译罚款,甚至可以运行,如果我尝试创建相同的向量(存储指向Shape的指针)在主函数内。这个问题发生在addShape方法内部,当vector类中的push_back方法被调用时,出于某种原因它使用了空指针。我花了几个小时试图破坏这个问题,但我似乎无法找到它的原因。 我得到的错误是:
答
您正在访问未初始化的指针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
类应该有虚析构函数。如果您试图通过迭代list
来存储在list
中的对象delete
,则程序将调用未定义的行为,因为Shape
没有虚拟析构函数。
'list-> addShape(r);' - 'list'指向哪里?为什么不简单地'ListOfShapes list;'? – PaulMcKenzie
*我的代码编译良好,甚至运行* - “编译好”只意味着没有语法错误。它对程序是否在逻辑上是正确的没有影响。 – PaulMcKenzie
非常感谢,我应该从一开始就意识到。问题解决了 – Hamza