c++ - 将指针分配给循环链表的头部时崩溃
问题描述
我正在做 Savitch 编写的使用 C++ 全球版解决问题的第 13 章的编程项目 6 。我试图重载<<
运算符以打印列表。它一直工作到我的 walker 指针第二次分配给头指针的值,这使我无法将列表用作项目要求的循环链表。我在这里重新创建了崩溃源的最基本形式:
Suitors.h 文件:
#include <iostream>
struct Suitor {
int number;
Suitor *link;
};
class Suitors {
private:
Suitor *head=nullptr;
int size=0;
public:
//Constructors
Suitors(int sizePar);
~Suitors(); //Destructor
//Print list
friend std::ostream& operator<<(std::ostream& outs, const Suitors& list);
};
Suitors.cpp 文件:
#include "Suitors.h"
Suitors::Suitors(int sizePar) {
Suitor *tempPtr = new Suitor;
size = sizePar;
for (int i=0; i<size; i++) {
if (head==nullptr) {
head = tempPtr;
}
tempPtr->number = i+1;
if (i==size-1) {
tempPtr->link = head;
}
else {
tempPtr->link = new Suitor;
}
tempPtr = tempPtr->link;
}
}
Suitors::~Suitors() {
Suitor *walker1 = head, *walker2 = head;
for (int i=0; i<size; i++) {
walker1 = walker1->link;
delete walker2;
walker2 = walker1;
}
head = nullptr;
}
std::ostream& operator<<(std::ostream& outs, const Suitors& list) {
Suitor *walker = list.head;
walker = walker->link;
walker = list.head;
/*
for (int i=0; i<list.size; i++) {
outs << walker->number << " ";
walker = walker->link;
}
*/
}
main.cpp 文件:
#include <iostream>
#include "Suitors.h"
void project6();
int main() {
std::cout << "Hello, World!" << std::endl;
project6();
return 0;
}
void project6() {
Suitors six(6);
std::cout << six << std::endl;
}
我已将 << 运算符重载缩减为造成错误的原因。walker 设置为链表头,然后推进一个节点,然后设置回链表头,导致错误。期望的行为是能够多次将 walker 设置为头节点。
解决方案
当我编译你的代码时,编译器告诉了我两件事。
- 函数中没有
return
声明,std::ostream& operator<<(std::ostream&, const Suitors&)
声明为返回非void
。 - 该
outs
函数的参数未使用。
尽管编译器缺乏人类智能,但他们确实擅长发现代码中的疏忽。return outs;
因此,我通过在该函数中添加该行来解决这些警告。分段错误消失了。
推荐阅读
- android - JDK 1.8.x 的要求检查失败!检测到的版本:13.0.1
- c - 在 gdb 中,我们可以将变量设置为表达式吗?
- java - 为什么选择数组列表
作为一个长而随机的字符串存储在 H2 数据库中? - mysql - 使用 custems 字段作为语句的两种不同海关邮政类型的 WP 查询
- javascript - TypeScript 中的 async/await 和 promise
- amazon-web-services - Amazon AWS:在本地下载亚马逊卷备份
- android - 吐司在 PictureInPicture 模式下看起来很奇怪
- cucumber - 如何绕过 Cypress + Cucumber 中的登录
- java - 是否有任何预定义的方法来交换两个元素?
- flutter - 如何在 Post Api Call inFlutter 中传递此类数据?