梦想的彼岸花开 2024-03-28 11:25 采纳率: 77.8%
浏览 56
已结题

vs std::string销毁时崩溃

在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 */
    }

  • 写回答

3条回答 默认 最新

  • Loup&卡普 2024-04-02 15:23
    关注

    std::string 不需要我们析构, 你这里的问题时 双重析构了。
    这里看起来是双重析构 字符串在两个地方析构了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月26日
  • 已采纳回答 4月18日
  • 创建了问题 3月28日