对于我的类函数,我得到双重自由或损坏错误

时间:2017-05-10 19:46:19

标签: c++ class pointers

这是我的.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 *** 中止(核心倾倒) 我有复制构造函数和任何东西,我该怎么办?

2 个答案:

答案 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。