(私の英語では申し訳ありません、私はウクライナ語です)私は "スタックの番号"(コンソールアプリケーション)を実現するプログラムをやっています。私は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;
}
あなたのコピーコンストラクタでオブジェクトを渡すために、それはありません、既定のコピーコンストラクタ*(あなたが行うように)浅い*コピーよりも異なるません。 –