仅双击 运行 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()
方法生成的。 QString
由 whatsThis()
方法 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
我有以下代码:
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()
方法生成的。 QString
由 whatsThis()
方法 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