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;
}
};
所有这些都在共享库中实现。
我在第二个库中使用第二个类,如:
void ThridClass::foo( )
{
MyOtherClass c1;
MyOtherClass c2;
c1 = c2;
}
在64位编译模式下使用xlC_7,没有对齐编译指示,没有优化,非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上并不适用,并且工作正常。
有什么想法吗?
答案 0 :(得分:1)
只是放弃你的副本分配和复制构造函数定义 - 隐式编译器生成的定义绰绰有余。
答案 1 :(得分: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.
}
}