这是我的.cpp文件内容:
#include <iostream>
#include"1.h"
using namespace std;
Stack:: Stack(){
size=20;
a=new int[size];
top=-1;
}
Stack::Stack (int si){
size=si;
a=new int[si];
top =-1;}
Stack::Stack(Stack& s){
a=new int[s.size];
for(int i=0 ; i<s.size; i++)
a[i]=s.a[i];
size=s.size;
}
Stack::~Stack(){
delete [] a;
}
void Stack::Push(int data){
if(this->isfull())
cout<<"stack is full!\n";
else
a[top++]=data;
}
int Stack::Pop(){
if(this->isempty())
cout<<"stack is empty!\n";
else
return a[top--];
}
bool Stack::isempty(){
if(top==-1)
return true;
else
return false ;
}
bool Stack::isfull(){
if(top==size-1 )
return true ;
else
return false ;
}
void Stack::Print(){
for(int i=top ; i>-1 ; i--)
cout<<a[i]<<endl;
}
int main(){
Stack a(3);
a.Push(1);
a.Push(3);
cout<<a.Pop();
a.Push(5);
a.Push(7);
a.Print();
return 0;
}
运行程序后,我收到以下错误: `。#&#39;:双重释放或损坏(出)错误:0x000000000240a010 *** 中止(核心倾倒) 我有复制构造函数和任何东西,我该怎么办?
答案 0 :(得分:2)
top
设置为-1,因此a[top++]=data;
中的Stack::Push(int)
是未定义的行为(尝试写入a[-1]
,这超出了数组范围) 。这是错误消息引用的损坏,仅在调用delete [] a
时由标准库注意到。将其更改为a[++top] = data;
。top
,其副本中的值未初始化。因此,从副本中阅读top
undefined behavior。Stack(Stack const &)
。Stack & operator=(Stack const &);
。答案 1 :(得分:1)
a[top++]
初始化a[++top]
时, top
应为-1
,否则您将拥有超出限制的访问权限,因此UB。