在QT程序的一个结构体中使用 string 来保存一个文件名,整个程序只有三个地方用到了,在 debug 下程序退出时,崩溃了,崩溃点在 vs 的 xutility 的 222 行。
程序中用该结构体定义了几个结构体数组,但我都使用 memset 初始化为 0 了。如果我把这个 string 字段删除,在调用的地方用 "123" 之类的代替,程序退出时不会崩溃;如果不删除,仅仅是把调用的地方全都去掉,也会崩溃,所以应该不是调用的这些地方的问题,根据查看调用堆栈,应该是结构体数组这个地方析构出问题了。
我在析构函数中使用 for 循环依次对结构体数组中的每一个都进行 memset 的话就不会崩溃。这个是什么原因呢?string 的销毁是应该不需要我们手动处理的呀。
// 结构体
struct TEST
{
// ...
string strFilePath;
// ...
};
// 第一个使用的代码
QString fileName;
// fielName 内容处理 ...
Test info;
info.strFilePath = fileName.toStdString();
// 第二处和第三处使用的代码逻辑相同,在不同的函数中
QListWidgetItem *item = new QListWidgetItem(QString::fromStdString(info.strFilePath ));
以上代码中我把结构体中 string 注释掉,第一处使用也注释掉,第二处、第三处改为使用 "123",程序不会崩溃,不删除结构体中的string,仅注释和修改使用的地方,程序退出时会崩溃。
//info.strFilePath = fileName.toStdString();
QListWidgetItem *item = new QListWidgetItem(QString::fromStdString(“123” ));
崩溃所在位置 xutility 222 行
// MEMBER FUNCTIONS FOR _Container_base12
inline void _Container_base12::_Orphan_all() noexcept
{ // orphan all iterators
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Myproxy != nullptr)
{ // proxy allocated, drain it
_Lockit _Lock(_LOCK_DEBUG);
for (_Iterator_base12 **_Pnext = &_Myproxy->_Myfirstiter;
*_Pnext != nullptr; *_Pnext = (*_Pnext)->_Mynextiter)
(*_Pnext)->_Myproxy = nullptr; // 这个地方
_Myproxy->_Myfirstiter = nullptr;
}
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
}