2017-05-10 55 views
-3

這是我的.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; 
} 

並運行該程序後,我得到以下錯誤: 錯誤`./1 ':雙免費或腐敗(出):0x000000000240a010 *** 中止(核心傾銷) 和我有複製構造和任何事情,我該怎麼辦?

+4

'1.h'的內容是什麼? – cdhowie

+3

['valgrind'](http://valgrind.org/) – zwol

+3

請編輯您的問題以提供[mcve]。 –

回答

1
  • 默認的構造設置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 &);
+0

是否真的可以編寫'Stack(Stack const&)'而不是'Stack(const Stack&)'還是它是一個錯字? – user463035818

+0

不是錯字,但由於某種原因,我以前從未見過 – user463035818

+1

@ tobi303這是可能的,我更喜歡它,因爲它使複雜的指針聲明更加明顯 - 「const」始終指向左側的東西,所以大多數聲明自然是從右到左讀取的。 'A ** const * const'是一個指向指向'A'的常量指針的常量指針。同樣,'一個const&'是一個常量'A'的引用。 '一個const&'和'const A&'具有相同的類型。 'const A&'是允許的,但是我發現'const'有時候指的是右邊的東西,有時候左邊的東西有點愚蠢。因此,我總是把它放在常量之後。 – cdhowie

1

a[top++]a[++top]你在-1初始化top,否則你有越界訪問,因此UB。

相關問題