c++ - 分段故障类列表
问题描述
我定义了以下类列表。我正在尝试通过覆盖我在类中声明的 [] 运算符来显示所有元素
template <typename Data>
class List{
protected:
ulong size = 0;
struct Node{
Data value;
struct Node *next;
//...
}
struct Node *top = nullptr;
public :
//...
Data& operator [](ulong) const;
//...
};
//Specific Constructor
template <typename Data>
List<Data>::List(ulong newSize, Data value){
size = newSize;
struct Node* tmp;
struct Node* tmp2 = nullptr;
for(ulong i = 0; i < newSize; i++){
tmp2 = new struct Node(value);
if(top == nullptr){
top = tmp2;
}else{
tmp = top;
while(tmp->next != nullptr){
tmp = tmp->next;
}
tmp->next = tmp2;
}
}
}
//Copy Constructor
template <typename Data>
List<Data>::List(const List<Data>& ref){
size = ref.size;
struct Node* tmp = ref.top;
struct Node* tmp2 = nullptr;
struct Node* tmp3;
while(tmp != nullptr){
tmp2 = new struct Node();
tmp2->value = tmp->value;
if(top == nullptr){
top = tmp2;
}else{
tmp3 = top;
while(tmp3->next != nullptr){
tmp3 = tmp3->next;
}
tmp3->next = tmp2;
}
tmp = tmp->next;
}
}
// Move Constructor
template <typename Data>
List<Data>::List(List<Data>&& ref){
std::swap(size, ref.size);
std::swap(top, ref.top);
}
template <typename Data>
Data& List<Data>::operator [](ulong i) const{
if(size == 0)
throw std::length_error("Lista vuota!");
else if(i >= size)
throw std::out_of_range("Lista troppo corta!");
struct Node* tmp = top;
for(ulong index = 0; index <= i-1; index++)
tmp = tmp->next;
return tmp->value;
}
int main(){
List<int> l1(10,5); //List of 10 elements all equals to 5
for(ulong i = 0; i < l1.getSize(); i++)
std::cout << l1[i] << std::endl;
return 0;
}
(我把最重要的东西放在这个问题上)我在分配期间没有收到任何错误(例如:l1[3] = 20;)但在这种情况下我得到了一个 sigFault,我不明白为什么。谢谢您的帮助。
解决方案
for 循环operator[]
使用了不适当的条件。对于 的无符号比较index <= i-1
和 0 的值i
,条件是index <= unsigned(-1)
,这将始终为真。
条件可以改写为index < i
:
for (ulong index = 0; index < i; index++)
tmp = tmp->next;
或者你的循环可以重写为一个while循环:
while (i-- > 0)
tmp = tmp->next;
推荐阅读
- node.js - Node.js、Angular、express-session:由于 cookie 策略(sameSite cookie),Chrome 80 不保存会话
- node.js - 在 npm-cache 目录中,除了 _cacache 之外的文件夹是干什么用的?
- algorithm - 冒泡排序需要多少遍?
- c++ - 从地图构建跨度
- javascript - 在对象中搜索确切值(许可证检查)
- python - ValueError:模型的特征数量必须与输入匹配。模型 n_features 为 4,输入 n_features 为 2
- javascript - 在窗口调整大小时设置元素大小
- python - 使用python查找空值表单形状文件属性字段
- angular - 如何在路由之间传递数据 - 不是查询参数。角 5
- javascript - jQuery:如果列表项已选中单选按钮,则添加类