基本上,我寫一類具有另一個類陣列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,並且工作正常。
有什麼想法?
你在說什麼「問題」?它是否會造成意外的結果? –
兩者,如果數組足夠大,堆棧幀崩潰和內核就會被轉儲,因爲operator =()函數內的任何asignment都是在較小的地址中進行的。 –
這只是堆棧中有太多對象的結果,導致堆棧溢出。儘管如此,我不知道「操作符=()函數中的任何賦值是在小地址中做什麼」的意思。 –