QT QString问题?

xiaolawlaw 2011-11-01 03:20:48
在一个方法里有这样两句:
QString str = "aaa";
return pDataManipulation->QueryID(str.toStdString().c_str());

执行完以后出现:
Windows 已在 aaa.exe 中触发一个断点。

其原因可能是堆被损坏,这也说明 aaa.exe 中或它所加载的任何 DLL 中有 bug。

我跟踪了一下发现是string的析构那里报错。
而且凡是有str.toStdString().c_str()的地方都会报这个错误。

原来是用QT4.7.0开发的,现在用的4.7.3有影响吗?是哪个DLL文件不对吗?
...全文
442 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
linshuaigoahead 2011-11-03
  • 打赏
  • 举报
回复
我写的程序里面这个函数执行也是有问题,程序到这里就报错了,跟进去也看不懂,这个是不是跟工程的字符集设置有关系?哪位大侠解释一下
乔巴好萌 2011-11-03
  • 打赏
  • 举报
回复
QString和const char *之间转换时
最好使用QVariant 做中间的转换变量
然后制定字符集进行转换
否则可能由于QString的字符集设置问题导致对内存区有不同的解释 进而析构时越界
wopabe 2011-11-03
  • 打赏
  • 举报
回复
个人感觉是没有影响的,放心用吧
zhu_xz 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaolawlaw 的回复:]

不是这个原因,,,我新建另外一个工程同样的写法就没有问题,而出错的工程用你的写法也还是有同样的问题。
[/Quote]
野指针指向的内存什么时候会被其他内容覆盖是操作系统决定的,所以有可能在一段时间之后仍然"有效"

我在1楼的回复中没有注意到你的return语句,所以才有了2楼的补充
重点在于,你的return之后,str.toStdString()出来的临时变量被释放了,你需要将这个临时变量保存到一个不会被释放的地方,例如直接return这个str.toStdString()
founderfang 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhu_xz 的回复:]
说错了刚才......

问题是你的c_str()指针在return之后成为了野指针
[/Quote]

这个难道不是正确答案吗?
xiaolawlaw 2011-11-02
  • 打赏
  • 举报
回复
不是这个原因,,,我新建另外一个工程同样的写法就没有问题,而出错的工程用你的写法也还是有同样的问题。
zhy282289 2011-11-02
  • 打赏
  • 举报
回复
toStdString()这个使用是有限制的..你看下manual
你应该这样str.toLocal8Bit().data()
zhu_xz 2011-11-01
  • 打赏
  • 举报
回复
说错了刚才......

问题是你的c_str()指针在return之后成为了野指针
zhu_xz 2011-11-01
  • 打赏
  • 举报
回复
出错的原因是临时变量被释放,导致c_str()返回的指针成为野指针

你应该:
std::string tmp = str.toStdString();
return pDataManipulation->QueryID(tmp.c_str());

16,814

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧