问题描述
我对C ++比较陌生,自从上大学课程以来,我已经练习了一个月,我想扩展自己的知识并尽可能多地学习,以便编写出色的代码。我们有一个任务,我们应该创建三个类,在第三类中,我们应该编写第二类的对象并对其进行分组,然后对它们进行处理,换句话说,我们被要求创建一个名为pilot的类。 ,飞机,然后是由飞机组成的机队。老师们给出了这个解决方案,与我的设想相去甚远,看看:
class Fleet {
private:
struct PlaneList {
Plane* p;
PlaneList* next;
PlaneList* node = nullptr,*next_node = nullptr;
public:
void PlaneAdd(Plane* current) {
if (node == nullptr) {
node = new PlaneList;
node->p = current;
node->next = nullptr;
next_node = node;
}
else next_node->next = new PlaneList;
next_node = node->next;
next_node->p = current;
next_node->next = nullptr;
}
};
现在,据我所知,我们创建了一个包含指针的列表,这些指针指向另一个类中的共同响应平面?另外,内存分配是很奇怪的,我不太了解,当我将此代码粘贴到MSVC中时,程序可以编译,但崩溃,并显示以下消息:next_node = node-> next;是NULLPTR且有访问冲突?为什么会出现此错误? 我完全感到困惑,如果您能向我解释一下,我将不胜感激。另外,我读到使用列表会严重影响性能,而使用向量等东西则效率更高。
解决方法
让我们使用您的PlaneAdd
函数并将其重新格式化:
void PlaneAdd(Plane* current) {
if (node == nullptr) {
node = new PlaneList;
node->p = current;
node->next = nullptr;
next_node = node;
}
else {
next_node->next = new PlaneList;
}
next_node = node->next;
next_node->p = current;
next_node->next = nullptr;
}
现在我们可以很容易地看到最后三个语句不属于else
的一部分。
因此,当node == nullptr
为true
时,执行这些语句时node->next
将为空指针。而您要做的第一件事是next_node = node->next
,它也将next_node
变成了空指针。这意味着下一条语句将取消引用该空指针,并导致未定义行为和可能的崩溃。