2011-09-08 69 views
0

基本上,我寫一類具有另一個類陣列atributte內,我的意思是:不同對象的指針值和它的該指針

class MyClass 
{ 
    unsigned long long x_; 
    bool y_; 

    public: 
    MyClass & operator=(const MyClass & mc) 
    { 
    x_ = mc.x_; 
    y_ = mc.y_; 
    return *this; 
    } 
}; 

class MyOtherClass 
{ 
    MyClass myClass_[9]; 

    public: 
    MyOtherClass & operator=(const MyOtherClass & mc) 
    { 
    for (unsigned int i = 0; i < 9; i++) 
    { 
     myClass_[i] = mc.myClass_[i]; 
    } 
    return *this; 
    } 
}; 

所有這一切在一個共享庫實施。在xlC_7 64位編譯模式

void ThridClass::foo() 
{ 
    MyOtherClass c1; 
    MyOtherClass c2; 
    c1 = c2; 
} 

,沒有對齊編譯指示,不優化,非virtual功能等,在AIX系統上運行:

我用第二類在第二個庫等。

這是我在這兩個庫所使用的編譯器選項:

-q64 -bernotok -g -M -qflag=i:w 

而這些鏈接器選項:

-brtl -bernotok -G 

當我使用dbx並要求c1.myClass_[0]地址我有一個調試程序值。但是,如果我在MyOtherClass.operator=()函數中執行執行,我會得到此屬性指針的另一個地址。

(dbx) p &c1.myClass_[0] 
0x0ffffffffffe6a20 
(dbx) s 
stopped in operator=(const MyOtherClass &) 
(dbx) p &myClass_[0] 
0x0ffffffffffe69c0 

這個問題在Linux上沒有apperar,並且工作正常。

有什麼想法?

+1

你在說什麼「問題」?它是否會造成意外的結果? –

+0

兩者,如果數組足夠大,堆棧幀崩潰和內核就會被轉儲,因爲operator =()函數內的任何asignment都是在較小的地址中進行的。 –

+0

這只是堆棧中有太多對象的結果,導致堆棧溢出。儘管如此,我不知道「操作符=()函數中的任何賦值是在小地址中做什麼」的意思。 –

回答

0

在您的運營商=返回循環

MyOtherClass & MyOtherClass::operator=(const MyOtherClass & mc) 
    { 
     for (unsigned int i = 0; i < 9; i++) 
     { 
      myClass_[i] = mc.myClass_[i]; 
      return *this; ////    Move this outside the loop. 
     } 
    } 
+0

爲什麼這會導致他的症狀ta喜歡? '&myClass_ [0]'應該總是一樣的。 –

+1

這是個好主意。但是'for'循環總是在這種情況下執行;所以不會發生'* this'不會返回的情況。 – iammilind

+0

對不起,這是一個抄寫錯誤。返回語句在循環之外 –

1

內就拋棄你的拷貝賦值和拷貝構造函數definitions-隱含的編譯器生成的將是綽綽有餘了。

+0

快速提問:對於具有帶有_explicit_賦值運算符的對象數組的類的編譯器生成的賦值運算符,是在分配父對象時調用的每個對象的賦值運算符?或者它只是做一個數組的內存按位副本? –

+0

@Seth:它調用'operator ='。所有特殊成員函數都是遞歸定義的。 – Puppy

+0

我寫了一個快速測試,看起來好像不會調用內部對象的'operator ='......我現在想知道當我在我的班級中有一個'vector'時,我的所有程序是如何工作的,並且我複製了這個類沒有複製構造函數! (或者,也許我總是寫複製構造函數或通過引用傳遞它,它一定是自然而然地來到我的) – Shahbaz