首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

遇到的一个内存分配的有关问题

2012-05-29 
遇到的一个内存分配的问题简单描述下遇到的问题.主程序是有UI 的程序. QT.程序启动后会有几个界面和线程开

遇到的一个内存分配的问题
简单描述下遇到的问题.

主程序是有UI 的程序. QT.
程序启动后会有几个界面和线程开始跑.
其中一个界面的对象中一个定时器和一个QString value.

定时器timeout后, 执行以下:
1.value = SomeClass::getValue(). 此接口返回类型为QString.
  之后没有对value写调用的地方.
2.调用一些C接口. 接口中有多次的calloc动作.
3.检查value的值.

异常:
经加打印发现.
计算QString value中的字符串地址. void* p = value.toLocal8Bit().data();
calloc申请的内存地址, 有时候会覆盖到 p 的空间.(发生几率大概为1/10 ~ 1/20).
问题重现的步骤都是 开机. 打印看p的地址及calloc申请的地址. 然后重启.

个人的理解:
QString中存储具体内容的char*空间是的动态申请的, calloc申请动态内存理论上不应该覆盖到这部分内存.
个人猜测的原因:
程序运行时内存被破坏, 导致系统识别p对应的内存为未被占用状态. 

已经为这个问题纠结2天.
请问大家有什么想法么.

[解决办法]
应该附上写主要的代码。。看看你是怎么写的。。
[解决办法]
附上主要问题段的代码。。不是全部!!

针对这个问题,你应为错误出现在那个函数,或者哪句话。。是这些代码!!
[解决办法]
void* p = value.toLocal8Bit().data();//QString value是不是个局部变量,如果是的可能出了作用域已经释放,这部分地址又回归了内存,内存就可以在分配出去。
[解决办法]

探讨
针对 xiebin133, cnsword的回答. 我重新加debug信息确认一次.

另外, 补充下信息
QString value;
是包含在一个大的UI类中, 该UI类对象是new出来的. 该UI对象在设计上会尽量保留不释放.
理论上该UI对象没有释放的话, value不会被释放, 是么?

[解决办法]
void* p = value.toLocal8Bit().data();
这个问题挺经典阿! 貌似很多人问过,也很多人回答过。value.toLocal8Bit().data()这个指针是很有问题的!
请不要这么用。要么你自己申请内存后把这个strcpy或者memcpy过去
[解决办法]
toLocal8Bit()这个的问题,他里面会创建一个QByteArray, 也就是他返回的地址并不是QString的地址,你可以用指针去访问下看看,而是一个局部的QByteArray的地址。
[解决办法]
理论上该UI对象没有释放的话, value不会被释放, 是么?

是的,只要不释放就一直存在!!

qDebug<< QString;这样debug信息 #include <QDebug>
[解决办法]
toLocal8Bit()这个方法的问题,他会创建一个局部QByteArray,你通过void *p去获取到的是QByteArray的地址,并不是QString的地址。出了作用于QByteArray被析构了。
[解决办法]
QString value 设置成一个if里面的局部变量就可以了。除了if的大括号 就出了作用域了。
[解决办法]
探讨
谢谢你的解答.

请帮忙看下下段.
void WelcomeForm::slotWifiScanResult()
{
......
const char* previous_ssid_str = ssid_previous.toLocal8Bit().data();
ap_info *ap_info_p = wireless_func_p->getSsidInfoByS……

[解决办法]
探讨

toLocal8Bit()这个方法的问题,他会创建一个局部QByteArray,你通过void *p去获取到的是QByteArray的地址,并不是QString的地址。出了作用于QByteArray被析构了。

热点排行