2017-04-15 2 views
-2

내가 실행할 때마다 내게이 오류를 준다. 코어 덤핑; C++에서 linkedStack을 수행하려고했습니다. 내 코드는 다음과 같습니다분할 오류입니다. 코어 내 코드에 버려진 C++

Node.h

class Node { 
public: 
    Node(int element); 
    const int& getElement()const; 
    Node *getNext() const; 
    void setNext(Node *e); 
    Node(const Node& orig); 
    virtual ~Node(); 

private: 
    int element; 
    Node *next; 
}; 

Node.cpp

#include "Node.h" 
Node::Node(int element) { 
    this->element=element; 
} 
const int& Node::getElement() const{ 
    return element; 
} 
Node * Node::getNext() const{ 
    return next; 
} 
void Node::setNext(Node *e){ 
    next=e; 
} 

Node::Node(const Node& orig) { 
} 

Node::~Node() { 
} 

LinkedStack.h

#include "Node.h" 
#include <iostream> 
#include "EmptyException.h" 


class LinkedStack { 
public: 
    LinkedStack(); 
    int size() const; 
    const Node& top() const; 
    void push(const int& element); 
    void pop(); 
    void print(); 
    LinkedStack(const LinkedStack& orig); 
    virtual ~LinkedStack(); 
private: 
    Node *front=NULL; 
    int num_elements; 
}; 

LinkedStack.cpp

#include "LinkedStack.h" 
using namespace std; 

LinkedStack::LinkedStack() { 
} 
int LinkedStack::size() const{ 
    return num_elements; 
} 
const Node& LinkedStack::top() const{ 
    return *front; 
} 
void LinkedStack::push(const int& element){ 
    Node *newfront=new Node(element); 
    newfront->setNext(front); 
    front=newfront; 
    delete newfront; 
    num_elements++; 
} 
void LinkedStack::pop(){ 
    if(num_elements==0){ 
     throw EmptyException(); 
    } 
    else{ 
     Node *oldfront=front; 
     front=front->getNext(); 
     num_elements--; 
    } 
} 
void LinkedStack::print(){ 
    Node *temp=front; 
    while(temp != __null){ 
     cout<<temp->getElement()<<endl; 
     temp=temp->getNext(); 
    } 
    cout<<""<<endl; 
} 

LinkedStack::LinkedStack(const LinkedStack& orig) { 
} 

LinkedStack::~LinkedStack() { 
} 

전부 MAIN.CPP

#include <cstdlib> 
#include <iostream> 
#include <string> 
#include "LinkedStack.h" 

using namespace std; 

/* 
* 
*/ 
int main(int argc, char** argv) { 
    string menu[]={"1.Afegir","2.Eliminar","3.Mostrar","4.Sortir"}; 
    int opc,element; 
    LinkedStack Stack; 
    do{ 
     for(int i=0;i<4;i++){ 
      cout<<menu[i]<<endl; 
     } 
     cout<<"Selecciona una opció"; cin>>opc; cout<<""<<endl; 
     switch(opc){ 
      case 1: 
       cout<<"Que vols afegir?... "; cin>>element; cout<<""<<endl; 
       Stack.push(element); 
       break; 
      case 2: 
       cout<<"Eliminant.... "<<endl; 
       Stack.pop(); 
       break; 
      case 3: 
       Stack.print(); 
       break; 
     } 

    }while(opc!=4); 

    return 0; 
} 

. 첫 번째 옵션 (밀어 넣기)을 시도해도 문제가 없지만 스택을 인쇄하거나 인쇄하려고 할 때 코어 덤프 : 조각화 오류 오류가 발생합니다.

나는 문제가 포인터에 관한 것이라고 생각하고있다. (??) 그러나 나는 아직도 어디서 어떻게 얻지 못한다.

당신이 생각의 닐 버터 워스의 라인에 따라 ^^

+0

'__null' - 저게 뭐지? –

+0

질문을 [편집]하여 [mcve]를 제공해주십시오. –

+0

'Node :: Node (int)'는'next'를 초기화하지 않습니다. – aschepler

답변

2

pop의 분할 방법을 일으키는 push 방법에 문제가 있습니다. 다음 줄

newfront->setNext(front); 
front=newfront; 
delete newfront; 

에서 당신 때문에 front=newfront 세트 포인터 같은 객체를 나중에 라인 삭제됩니다 front으로 뾰족한 물체에 다음 노드를 설정합니다.

분할 선 고장

null 객체 참조를 취소
front=front->getNext(); 

나타난다.

+0

어디서 오류인지 알 수 있지만 해결 방법을 모릅니다./ 몇 가지 변경을 시도했지만 여전히 작동하지 않습니다. – Shiro98

1

좋은 것입니다 도움이 될 수 있다면. __null은 무엇입니까? 정의한 매크로입니까?

nullptr을 사용하십시오. aschepler이 명시된 바와 같이 또한


void LinkedStack::print(){ 
    Node *temp = front; 
    while(temp != nullptr){ // compare it against nullptr if this is Modern C++ (e.g. C++11). For previous C++ standards you can use temp != 0 or !temp 
     cout << temp->getElement()<<endl; 
     temp = temp->getNext(); 
    } 
    cout << endl; 
} 
는 노드 생성자는 null 값 옆에 설정해야합니다.

Node::Node(int element) { 
    this->element = element; 
    this->next = nullptr; 
} 
+0

조언을 사용하여 코드를 변경했지만 여전히 @ImrePiller와 같이 작동하지 않는 문제는 팝업에서 프런트 -> getNext()의 세분화를 만드는 푸시에 있다고 말합니다. 하지만 어떻게 해결할 지 모르겠다. – Shiro98