2014-06-18 27 views
-1

我正在使用前同事编写的ApxTrace类Visual C++ 2010/QT:为什么类的赋值操作符被调用?

外部类将调用copyTrace()公共成员函数来复制ApxTrace类。 ApxTrace类包含QVector数据成员

下面是代码:

void ApxTrace::copyTrace(ApxTrace& trace) 
{ 
    *this = trace; 
} 

但是它给了未处理的异常(QTCored4.dll):访问冲突写入位置在软件的调试版本0xfeeeefeee。有趣的是,要注意的是代码在软件的发行版中运行良好。

调用堆栈显示ApxTrace::operator=(const APxTrace &_that)被调用,但是,ApxTrace类不支持赋值运算符。

请咨询:

  1. 为什么赋值运算符被称为在这种情况下?
  2. 评论上面的CopyTrace()?我知道自我分配不在这里处理。
  3. 为什么它在软件的发行版的工作呢?
+5

嗯,你的函数分配'trace'到'* this'。如果没有调用赋值操作符,你期望发生什么? –

+0

至于Q3,你的代码可能已经某处未定义行为,编译器帮忙,在你的调试版本检查你。未定义的行为包括似乎工作,崩溃或[让你怀孕](http://stackoverflow.com/a/1553407/2756719)。 –

+1

要回答“为什么它在软件的发布版本中运行良好”,答案是错误软件的行为不可预测。修复这个错误,这个谜将消失。 –

回答

1

1.为什么在这种情况下调用赋值运算符?

因为如果没有明确定义则编译器将它定义隐含前提是由编译器为已删除它没有定义明确的功能

*this = trace; 

的机构,称为。

至于第三个问题,那么有可能是该方案已未定义行为。

+0

非常感谢您的回复。非常感激 – user3753452

相关问题