Наличие как конструктора копирования, так и деструктора вызывает segfault, но только с одним или другим

Это что-то очень странное, с которым я столкнулся, которого я никогда раньше не видел. Я пишу стек ADT для проекта компьютерной науки.

Это моя ситуация:

Когда я пытаюсь проверить конструктор копирования, используя функцию (значение по вызову), я получаю segfault при запуске моей программы.

Поэтому я просмотрел свой код и искал обычные причины segfaults (двойное удаление, ошибка логики указателя и т.д.) И ничего не мог найти.

Поэтому я попытался прокомментировать тело копии (это просто тело, а не прототип функции только тела). У меня все еще есть segfault.

Итак, я попытался полностью комментировать конструктор копирования (protype, function и все), а затем segfault (но, конечно, это оставляет меня со стандартным конструктором, что не очень хорошо с указателями)

Так что это действительно смутило меня, почему бы просто создать конструктор копий вообще, даже если это ничего не вызвало segfault?

Я попробовал то же самое с деструктором, и обнаружил, что после того, как я полностью его прокомментировал (это прототип и все), я снова обнаружил, что код работает без segfaults (но, конечно, это означает, что без деструктора, который вызывает утечку памяти!)

//test.cpp - test program to test the copy constructor
 #include "stack.hpp"

 void test(STACK <int> x){
 }

 int main(void){
 STACK <int> a;
 a.push(1); a.push(2);
 test(a);
 }

//stack.hpp - ADT developed for project

//Stack.hpp -> developed for project 3
#include <cassert>
#include <new>
#include <iostream>

#ifndef STACK_HPP
#define STACK_HPP
const bool debug= false;


template<class t="">
class NODE{

public:
 NODE(){next= 0;};
 T data;
 NODE *next;
};



template <class u="">
class STACK{

public:
 STACK(){begin= 0;};

 bool empty()const{return begin == 0;};
 bool full()const;
 void push(U);
 U pop();
 void swap(STACK <u> &);

 ~STACK();
 STACK(const STACK <u> &);
 STACK <u> & operator=(const STACK <u> &);

private:
 NODE <u> *begin; 

};

template <class u="">
bool STACK<u>::full()const{
 NODE <u> *test= new(std::nothrow) NODE <u>;

 if(test== 0){
 return true;
 }

 else{
 delete test;
 return false;
 }
}

//Requires not full
template <class u="">
void STACK<u>::push(U x){
 assert(!full());

 if(empty()== true){
 begin= new NODE <u>;
 }

 else{
 NODE <u> *tmp= new NODE <u>;
 tmp->next= begin;
 begin= tmp;
 }

 begin->data= x;

}

//Requires not empty
template <class u="">
U STACK<u>::pop(){
 assert(!empty());
 U result;

 if(begin->next == 0){
 result= begin->data;
 delete begin;
 begin= 0;
 }

 else{
 NODE <u> *tmp= begin->next;
 result= begin->data;
 delete begin;
 begin= tmp;
 }

 return result;
}

template <class u="">
STACK<u>::~STACK(){
 if(debug)std::cout << "destroy";

 while(!empty())
 pop();

 }

template <class u="">
STACK<u>::STACK(const STACK <u> & orig){
 if(debug)std::cout << "copy";

 if(!orig.empty()){
 NODE <u> *cur= orig.begin;
 STACK temp;

 while(cur!= 0){
 temp.push(cur->data);

 cur= cur->next;
 }

 cur= temp.begin;

 while(cur!= 0){
 push(cur->data);
 cur= cur->next;
 }

 }
 }

template <class u="">
void STACK<u>::swap(STACK <u> & other){
 NODE <u> *tmp= begin;

 begin= other.begin;

 other.begin= tmp;
}

template <class u="">
STACK<u>& STACK<u>::operator=(const STACK& rhs){
 STACK tmp(rhs);
 swap(tmp);
 return *this;
}

#endif
</u></u></class></u></u></u></class></u></u></u></class></u></class></u></u></class></u></u></u></u></class></u></u></u></class></u></u></u></u></u></class></class></iostream></new></cassert></int></int>
1 ответ

Единственные проблемы, которые я вижу:

  1. Вы не begin инициализацию, когда orig пуст.

Когда я добавил строку:

begin = NULL;

прямо перед линией

if(!orig.empty()){

программа работала без ошибок на моей машине.

licensed under cc by-sa 3.0 with attribution.