inline QString::QString(const QString &other) : d(other.d)
{ Q_ASSERT(&other != this); d->ref.ref(); }
//其上一层调用 //伪代码
strList << iter->value().str1 << iter->value().str2..
这是QString的拷贝构造函数,自我复制,导致无限循环,最终致使程序栈溢出。关于拷贝构造函数请参考-百度百科:https://baike.baidu.com/item/%E6%8B%B7%E8%B4%9D%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0/9344013?fr=aladdin
机缘巧合,在帮同事处理问题时发现,错误的使用QMap的迭代器(如果iter时map.end() 则执行iter->value() 时,便会发生同样的异常-函数调用栈信息)。经过进一步排查,发现此处存在多线程同时遍历一个map的情况。QMap是可重入的(http://doc.qt.io/archives/qt-4.8/qchar.html)- Note: All functions in this class are reentrant.
但是Qt指导手册中并没有提到 iterator Class 是可重入的。(http://doc.qt.io/archives/qt-4.8/threads-reentrancy.html#reentrant)在官方文档中,可以看到,如果某个Qt类是可重入或线程安全的,会进行单独标记的。也就是说iterator应该是不可重入的。
Qt-隐式共享:https://blog.csdn.net/zhu_xz/article/details/6061201
GCC在C语言中内嵌汇编 asm __volatile__:https://blog.csdn.net/pbymw8iwm/article/details/8227839
AT&T与Intel汇编语法的比较:https://blog.csdn.net/happy987818/article/details/51557502
常用的汇编指令:https://blog.csdn.net/qq_33733970/article/details/78572733
C++Union的用法:https://blog.csdn.net/lincyang/article/details/6176642
关键信息:
使用C++联合,尤其是匿名联合,虽可以节省内存空间,但是也有一定的风险,如果通过一个不适当的数据成员获取当前对象的值!例如上面的ch、i交错访问,就是联合内存上存PartA的时候,却执行了PartB的访问。