Visual C++ 2010 / QT:为啥调用类的赋值运算符?
Posted
技术标签:
【中文标题】Visual C++ 2010 / QT:为啥调用类的赋值运算符?【英文标题】:Visual C++ 2010 / QT : Why assignment operator of the class was called?Visual C++ 2010 / QT:为什么调用类的赋值运算符? 【发布时间】:2014-06-18 19:59:21 【问题描述】:我正在编写一个前同事编写的 ApxTrace 类
外部类会调用copyTrace()
公共成员函数来复制一个ApxTrace类。
ApxTrace 类包含QVector
数据成员
代码如下:
void ApxTrace::copyTrace(ApxTrace& trace)
*this = trace;
但是它给出了未处理的异常(QTCored4.dll):在软件的调试版本中写入位置0xfeeeefeee的访问冲突。有趣的是,代码在软件的发布版本中运行良好且正常。
callStack 显示调用了ApxTrace::operator=(const APxTrace &_that)
,但是,ApxTrace 类不支持赋值运算符。
请指教:
-
为什么在这种情况下调用赋值运算符?
评论上面的
CopyTrace()
?我知道这里不处理自我分配。
为什么它在软件的发布版本中运行良好?
【问题讨论】:
嗯,您的函数将trace
分配给*this
。如果不调用赋值运算符,您希望发生什么?
至于 Q3,您的代码可能在某个地方存在未定义的行为,编译器会在您的调试版本中帮助您检查。未定义的行为包括看似有效、崩溃或getting you pregnant。
要回答“为什么它在软件的发布版本中运行良好”,答案是有缺陷的软件行为不可预测。修复错误,谜团就会消失。
非常感谢您的回复。非常感谢
【参考方案1】:
1.为什么在这种情况下调用赋值运算符?
因为它是在函数体中显式调用的
*this = trace;
如果没有显式定义,那么编译器会隐式定义它,前提是它没有被编译器定义为删除。
至于第三个问题,那么程序可能有未定义的行为。
【讨论】:
以上是关于Visual C++ 2010 / QT:为啥调用类的赋值运算符?的主要内容,如果未能解决你的问题,请参考以下文章
为啥以下无法在 Visual Studio 2010 C++ 下编译?
如何使用 Visual C++ 2010 Express 从 32 位环境为 64 位 Windows 编译 Qt?
Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?
Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?
为啥某些 Microsoft 语言被称为“视觉”? (Visual C#、Visual Basic .NET、Visual C++)