遇到的一个内存分配的有关问题
遇到的一个内存分配的问题简单描述下遇到的问题.主程序是有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是不是个局部变量,如果是的可能出了作用域已经释放,这部分地址又回归了内存,内存就可以在分配出去。
[解决办法]
[解决办法]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的大括号 就出了作用域了。
[解决办法][解决办法]