编码SLL时获取中止陷阱6

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编码SLL时获取中止陷阱6相关的知识,希望对你有一定的参考价值。

我是c ++的新手。试图制作一个简单的单链表程序。代码如下。这里我创建了一个Node类,SLL类和相应的函数。

#include <iostream>
using namespace std;
class Node{

    private:
        int data;
        Node* next;

    friend class SLL;
};

class SLL{
    public:
        SLL();
        ~SLL();
        bool empty() const;
        const int& front() const;
        void addFront(const int& e);
        void removeFront();
        void printList();
    private:
        Node* head;
};

SLL::SLL()
    :head(NULL){ }

SLL::~SLL(){
    while(!empty())
        removeFront();
}

bool SLL::empty() const{
    return head == NULL;
}
void SLL::removeFront(){
    Node* temp = head;
    head = temp->next;
    delete temp;
}

void SLL::addFront(const int& e){
    Node* n = new Node;
    n->data = e;
    n->next = head;
    head = n;
}

void SLL::printList(){
    Node* temp = head;
    // int n =0 ;
    while(temp->next){
        // n++;
        cout<< temp->data << " ";
        temp = temp->next;
    }
    delete temp;
}

int main(){
    SLL a;
    a.addFront(1); 
    a.printList();
}

当我编译程序时,得到以下错误。

ol(36664,0x7fff8a6e0340) malloc: *** error for object 0x7fb055402820: pointer being freedwas not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

为什么会出现此错误?什么是解决方案?

答案

delete temp;中的printList不会破坏变量temp;局部变量已经自动销毁。 (实际上,技术术语是“自动存储持续时间”。)毕竟,不需要(或可能)delete

void f() {
  int i=std::rand();
  std::cout << i;
}

它破坏了temp指向的对象,从而破坏了你的清单。

每个delete使用new一次:在这种情况下,这意味着平衡addFrontremoveFront(这应该具有直观意义),包括在你已经在做的析构函数中。

以上是关于编码SLL时获取中止陷阱6的主要内容,如果未能解决你的问题,请参考以下文章

中止陷阱:C 程序中的 6 个

中止陷阱:strncat() 出现 6 个错误

如何修复 dyld:库未加载... 原因:找不到图像 中止陷阱:6?

C Hangman 程序调试辅助(中止陷阱:6 错误)[关闭]

从 OS X 中的 main 返回但不在 linux 上时中止陷阱 6

C中的“中止陷阱:6”错误?