2016-04-05 3 views
0

(Извините за мой английский, я украинский) Я делаю программу, которая реализовала «Stack of Numbers» (консольное приложение). Я хочу добавить деструктор, который будет очищать динамическую память, после удаления stac. Когда я делаю свой stac без деструктора - all right, если я добавляю деструктор - у меня есть error. Деструктор вызывается, когда приложение завершено, но у меня есть ошибка, когда программа вызывает первую функцию. Без деструктора у меня нет этой ошибки. Это мой исходный код, где деструктор закомментирован.После добавления деструктора у меня есть ошибка до того, как программа вызвала его

#include<iostream> 
#include<ctime> 
using namespace std; 

struct Oneof 
{ 
int num; 
Oneof* next; 
}; 

class Stac 
{ 
private: 
Oneof * first; 
public: 
/*~Stac();*/ 
Stac(); 
Stac(Stac &n); 
void New(int n);     //Adding new element 
int Remove();     //Reading last element and removing it 
int SetLast();     //Reading last element without removing   
void Read();      //Reading all stac 
friend bool Eq(Stac a, Stac b); //Equive two another stacs 
}; 

Stac::Stac(){first=NULL;} 

Stac::Stac(Stac &n){first=n.first;} 

/*Stac::~Stac() 
{ 
    while(first!=NULL) 
    { 
     Oneof *temp=first; 
     first=first->next; 
     delete temp; 
    } 
} 
*/ 

void Stac::New(int n)     //Adding new element 
{ 
Oneof* temp=new Oneof; 
temp->num=n; 
temp->next=first; 
first=temp; 
} 

int Stac::Remove()      //Reading last element and removing it 
{ 
int a=first->num; 
Oneof *temp=first; 
first=first->next; 
delete temp; 
return a; 
} 

int Stac::SetLast()     //Reading last element without removing 
{ 
return first->num; 
} 

void Stac::Read()      //Reading all stac 
{ 
Oneof* temp=NULL; 
Oneof* save=NULL; 
save=first; 
while(first!=NULL) 
{ 
    temp=first; 
    cout<<temp->num<<" "; 
    first=temp->next; 
} 
first=save; 
} 

bool Eq(Stac a, Stac b)     //Equive two another stacs 
{ 
Oneof* tempa=a.first; 
Oneof* tempb=b.first; 
while(tempa!=NULL && tempb!=NULL) 
{ 
    if(tempa->num==tempb->num) 
    { 
     tempa=tempa->next; 
     tempb=tempb->next; 
    } 
    else return false; 
} 
if(tempa==NULL && tempb==NULL)return true; 
else return false; 
} 

int main() 
{ 
Stac a; 
srand(time(0)); 
for(int i=0; i<10; i++) 
    { 
     a.New(rand()%100); 
    } 
Stac b(a); 

cout<<"Chek equive...\n"; 
bool equ=Eq(a,b); 
if(equ==0)cout<<"First!=Second\n"; 
else cout<<"First==Second\n"; 

cout<<"\nReading without removing first number of fisrt stac...\n"; 
int n=a.SetLast(); 
cout<<n<<endl; 

cout<<"\nReading first Stac...\n"; 
b.Read(); 

cout<<"\n\nReading second Stac...\n"; 
a.Read(); 

cout<<"\n\nAdding new number and reading first Stac...\n"; 
b.New(rand()); 
b.Read(); 

cout<<"\n\nRemoving number and reading second Stac...\n"; 
int last=a.Remove(); 
cout<<last<<endl; 
a.Read(); 

cout<<"\n\nChek equive...\n"; 
bool equ1=Eq(a,b); 
if(equ1==0)cout<<"First!=Second\n\n"; 
else cout<<"First==Second\n\n"; 

system("pause"); 
return 0; 

}

+0

Вашей копии-конструктор едва ничего копировать, он ничем не отличается от значения по умолчанию копирование конструктора, который делает * * неглубоко копирование (как вы делаете). –

ответ

2

Eq Ваша функция принимает два Stac объекты по значению

bool Eq(Stac a, Stac b) 

Поэтому a и b будет функция локальные копии ваших входов. Поэтому после завершения функции они выйдут из сферы действия, и их деструкторы будут вызваны. Для того, чтобы избежать локальных копий, передать объекты по const&

bool Eq(Stac const& a, Stac const& b) 
+0

Либо это, либо реализовать правильный экземпляр-конструктор (который является лучшим решением в долгосрочной перспективе, IMHO). –

+0

Вы можете изменить свою сигнатуру функции на второй метод, упомянутый мной (передается 'const &'). Также как @JoachimPileborg упомянул, что ваш конструктор копий написан неправильно, он копирует только первый элемент, он должен сделать глубокую копию всех элементов. – CoryKramer

+0

Спасибо за все, я понял. Поскольку мой cope-conctructor ошибочен, когда я удаляю элементы из первого Stac, я удаляю эти элементы и из второго Stac. И из-за этого деструктор может удалять элементы только для одного Stac и, когда он пытается удалить элемент из другого - я вижу ошибку. – Manbass