仅双击 运行 basic_string 析构函数时出现 qt C++ 异常

qt C++ exception on basic_string destructor on double click run only

我有以下代码:

CAtlString str = currentFolder->whatsThis().toStdWString().c_str();

currentFolder 是 qt QTreeWidgetItem*。 当我从 VS2010 运行 编程时,它工作正常。但是当我通过双击同一文件夹(x64/Debug 或 Release)启动程序时,我有例外:

Unhandled exception at 0x00007ffe2a07572a (ntdll.dll) in test.exe: 0xC0000005: Access violation reading location 0xffffffffffffffff.

在 basic_string 析构函数中 dealloc:

~basic_string()      // xstring
    {   // destroy the string
    _Tidy(true);
    }

// ...

void deallocate(pointer _Ptr, size_type) // in xmemory
    {   // deallocate object at _Ptr, ignore size
    ::operator delete(_Ptr);
    }

我正在尝试直接删除字符串、清理、擦除 - 但每次我都得到相同的结果。此外,我曾尝试使用不同的 运行 次并部署包,但运气不佳。 (使用 Dependency Walker 搜索)。 为什么程序在VS2010下运行?我该如何修复独立 运行ning? 谢谢!

更新 这是重现问题的最少代码: zalil.ru 使用 x64 配置和 运行 双击捕获异常的程序。

Update2 如果我让 wstring 指针保持活动状态(使用临时变量),我会出现以下错误:

当您使用默认项目设置在 Visual Studio 中调试您的应用程序时,工作文件夹设置为您的源所在的文件夹。当您 运行 独立应用程序时,工作文件夹是您的 exe 文件所在的文件夹。

错误说它无法解除分配 std::wstring,它是由 QString::toStdWstring() 方法生成的。 QStringwhatsThis() 方法 return 编辑。由于 std::wstring 无效,因此 QString 也无效。如果currentFolder指针是一个有效指针,它就不会return无效QString。所以 currentFolder 是一个无效的指针。

考虑到您的工作目录已更改,可能 currentFolder 未正确初始化。

当您使用 .c_str() 返回的内容时,您使用的是悬挂指针,因为 std::wstring 对象被销毁,但 c_str() 返回的指针仍然存在。 c_str() returns 内部指针,它指向的内存在 std::wstring 的析构函数中被销毁。

访问一个悬空指针是UB,这就是为什么你永远不知道它指向的内存是否仍然有效

解决方法:保留 std::wstring 直到您不再需要 c_str()

auto temp = currentFolder->whatsThis().toStdWString();
CAtlString str = temp.c_str();

我找到了问题解决方案。 据我所知,在我的电脑上我混合安装了 Qt 库(3 个不同的版本),当调用 std::string 析构函数时,我有 UB 因为调用了错误的运行时。 为了解决我的问题,我需要避免在 QString 转换中使用 toStdWString/c_str //for example like this auto arr = currentFolder->whatsThis().toUtf8(); std::string temp_str(arr.data()); qDebug() << temp_str.c_str();

或重新编译/清理重新安装 我使用过的所有库。它是如此奇怪的配置错误) 有决定的页面:forum.qt.io