2011-05-21 70 views
1
class Array 
{ 
    double *mx; int mn; 
public: 

Array(); 
~Array(){delete []mx}; 
Array& operator-(Array& b); //first right way 
Array operator -(Array b); //wrong way, but I don't understand why 
}; 

Array::Array() 
{ 
    mn=10; 
    mx=new double[mn]; 
} 

//first, works perfectly 
Array& Array::operator -(Array& b) 
{ 
    int i=0; 

    for(i=0;i<mn ;i++) 
     this->mx[i]-=b.mx[i]; 

    return *this; 
} 


// here is Error 

Array Array::operator -(Array b) 
{ 
    int i=0; 

    for(i=0;i<mn ;i++) 
     this->mx[i]-=b.mx[i]; 

    } 


int main() { 
    Array x,b; 
    x=x-b; 
} 

如果我使用第一個重載,所有的作品都是正確的。C++神祕傳遞類數組

但是,如果使用第二個,所有被編譯良好,但在執行程序時,我收到很多象這樣的錯誤:

"c++ ** glibc detected *** double free or corruption" 

http://s41.radikal.ru/i091/1105/e1/2349397c04a2.png

我想不通,爲什麼出現這種情況。

據我所知,當我打電話給Array Array::operator-(Array b)時,對象必須被複制,並且一切都必須良好,但是有錯誤。

好吧,我讀過,我要反對,分配在內存中的相同的地方。但我試着這樣做:

 Array Array::operator +(Array b) 
{ Array c; 
int i=0; 
for(i=0;i<mn;i++) 
this->mx[i]+=b.mx[i]; 
cout<<&this->mx<<" "<<&b.mx<<endl; 
exit(0); 
return c; } 

我已經有望獲得在內存地址相同....

答案是0xbfb45188 0xbfb45178爲什麼他們平等的嗎?

furhermore,當我在這裏聲明類的名稱(對象)
編譯器必須提供一個新的內存堆棧的對象 我在哪裏錯了?我不明白....

+0

你的問題是?來源和問題應該是分開的 - 在發佈像這樣的東西之前,先看看其他一些C++問題。 – 2011-05-21 14:21:37

+2

想一下複製構造,通過const ref ...... – Jagannath 2011-05-21 14:24:35

回答

1
  • operator-應該採取的引用,否則你不用執行副本。但是,並不是需要來。它當然應該返回一個值,因爲-在語義上給你一個新的對象。當您編寫c = a-b時,您不希望ab發生更改。
  • 如上所述,您不需要需要以參考operator-,而在第二個示例中,您將按價值獲取。這是確定的,除非你有第二個錯誤:
    • Array類有一個內部緩衝區,它new S於建築,而當它被摧毀delete S(~Array)。
    • 但是,它確實不用戶定義的拷貝構造函數和緩衝區不會自動複製給你;只複製指針mx
    • 所以,當你複製Array,你現在有對象具有指向同一緩衝區指針mx。當一個副本超出範圍時,該緩衝區爲delete d;一段時間後,另一個副本試圖做同樣的事情,並且兩次相同的緩衝區是一個錯誤。

我的建議:

  • 寫拷貝構造函數和operator=到您Array類。很重要。
  • operator-無論如何參考。它更有意義。

希望有幫助。

3
Array Array::operator -(Array b) 

這條線將創建數組的一個副本。由於您沒有複製構造函數,編譯器只會複製包含指針字段「mx」的所有字段。現在你有兩個對象都指向相同的分配內存。當每一個被破壞時,刪除[]將被稱爲....

您需要寫一個複製構造函數或確保不發生複製。 按引用

Array Array::operator -(Array& b) 

做通(這也許應該是const的太...但是這是一個不同的問題)

+0

注意這裏的返回值也應該是一個引用,也就是 'Array&Array :: operator-(Array&b)',爲了避免複製出路 – bodes 2011-05-21 14:35:41

+0

@bodes:錯了。 'operator-'應該返回一個新的對象。 – 2011-05-21 14:36:50

+0

@Tomalak特別關於@ JohnB的最後一段代碼,關於確保不發生複製......取決於編譯器優化的級別,通過值返回可能會複製副本,不是? – bodes 2011-05-21 14:38:36