Наличие как конструктора копирования, так и деструктора вызывает 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.