分段故障类别列表



我定义了以下类List。我试图通过在类中声明的[]运算符的覆盖来显示所有元素

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,我不明白为什么。谢谢你的帮助。

operator[]中的for循环使用了不适当的条件。对于index <= i-1的无符号比较和i的值为0,条件为index <= unsigned(-1),它将始终为真。

条件可以重写为index < i:

for (ulong index = 0; index < i; index++)
tmp = tmp->next;

或者你的循环可以被重写为while循环:

while (i-- > 0)
tmp = tmp->next;

最新更新