QT内存问题

gongzf111 2017-11-13 05:02:40
for(int j = 0; j < 28; j++)
{
QTableWidgetItem * item = new QTableWidgetItem(tr("%1").arg(data[page*records_page+i][j+0]));
ui->history_table->setItem(i,j,item);
}
以上代码频繁调用 会造成该内存泄漏么?new了很多 没有delete释放。。。
如果有 该怎么解决!!?
...全文
476 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不是设置界面显示一部分吗?比如100个。弄个按钮。翻页的时候。显示下面100个啊。几万个都一次显示?没必要。
走好每一步 2017-11-15
  • 打赏
  • 举报
回复
可以考虑用QTableView,这个可以SetModel。
张小飞Official 2017-11-15
  • 打赏
  • 举报
回复
引用 10 楼 u013914992 的回复:
[quote=引用 8 楼 u010370871 的回复:] 不会,只要是集成QObject的,都会被父类自动管理回收,可看下QObject的虚析构函数实现
QObject不是超级类么 所有的都直接或者间接的继承它[/quote] 所以才不用你管理啊
走好每一步 2017-11-15
  • 打赏
  • 举报
回复
QTableWidgetItem * item(int row, int column) const QTableWidgetItem * itemAt(const QPoint &point) const
走好每一步 2017-11-15
  • 打赏
  • 举报
回复
楼主,我也是醉了。 外面还有循环。。。 你tableWidget该不会是插入一项,你就new一项吧。 其实只需要new出显示的数量的item就可以了,翻页的时候,item复用
  • 打赏
  • 举报
回复
new时候赋给一个对应指针,程序退出或者在使用完的地方delete掉,就可以做到成对出现
gongzf111 2017-11-15
  • 打赏
  • 举报
回复
引用 3 楼 qq_20553613 的回复:
Qt new内存自动回收规则: 1、必须是QObject的子类; 2、指定父类对象,即是父类释放时自动释放子类; 好的习惯就是new和delete成对出现,确保万无一失!
如楼上的两个例子 不能成对出现 要是delete 数据就没有显示了
gongzf111 2017-11-15
  • 打赏
  • 举报
回复
引用 8 楼 u010370871 的回复:
不会,只要是集成QObject的,都会被父类自动管理回收,可看下QObject的虚析构函数实现
QObject不是超级类么 所有的都直接或者间接的继承它
gongzf111 2017-11-15
  • 打赏
  • 举报
回复
引用 7 楼 qqwangfan 的回复:
[quote=引用 6 楼 u013914992 的回复:] [quote=引用 5 楼 qqwangfan 的回复:] new时候赋给一个对应指针,程序退出或者在使用完的地方delete掉,就可以做到成对出现
我上面的两个例子中都不可以delete,delete之后就不显示了。。[/quote] 如果从头到尾只是new28个,中间不会不断添加,这个是你程序需要开的内存,也是必须的,可以放到程序结束才释放这部分内存。 如果会在程序中不断的new,new完后不用的时候又不释放的话就会内存泄漏,但是你new出来的都是必须要用到的,没办法释放,那也只能留着,不过这样你的程序所占用的内存就会越来越多,你必须要想到内存一直不断消耗的话会耗尽系统内存然后程序就会挂掉。[/quote] 一次不止28个 外面还有一个for循环 查询一次有可能几万个 因为是把数据库的数据查出来再显示到表格的。。 已经奔溃了 所有来找大神帮忙看看有啥好的解决方法没!
张小飞Official 2017-11-15
  • 打赏
  • 举报
回复
不会,只要是集成QObject的,都会被父类自动管理回收,可看下QObject的虚析构函数实现
  • 打赏
  • 举报
回复
引用 6 楼 u013914992 的回复:
[quote=引用 5 楼 qqwangfan 的回复:] new时候赋给一个对应指针,程序退出或者在使用完的地方delete掉,就可以做到成对出现
我上面的两个例子中都不可以delete,delete之后就不显示了。。[/quote] 如果从头到尾只是new28个,中间不会不断添加,这个是你程序需要开的内存,也是必须的,可以放到程序结束才释放这部分内存。 如果会在程序中不断的new,new完后不用的时候又不释放的话就会内存泄漏,但是你new出来的都是必须要用到的,没办法释放,那也只能留着,不过这样你的程序所占用的内存就会越来越多,你必须要想到内存一直不断消耗的话会耗尽系统内存然后程序就会挂掉。
gongzf111 2017-11-15
  • 打赏
  • 举报
回复
引用 5 楼 qqwangfan 的回复:
new时候赋给一个对应指针,程序退出或者在使用完的地方delete掉,就可以做到成对出现
我上面的两个例子中都不可以delete,delete之后就不显示了。。
gongzf111 2017-11-14
  • 打赏
  • 举报
回复
引用 1 楼 dext 的回复:
不会,这个被QTableWidget自动管理了。
是QTableWidget内部机制么?! 那下面的代码 class TimeScaleDraw: public QwtScaleDraw//定义一个新类去继承QwtScaleDraw,重新实现方法 { public: TimeScaleDraw( const QTime &base ): baseTime( base ) {}//baseTime,成员初始化QTime类型的base virtual QwtText label( double v ) const//重新实现里面的虚方法,此方法含义,将v值转换为代表标签label { QTime upTime = baseTime.addSecs((int)v);//强制将double类型的v转化为int类型,其实v就是坐标,当前时间加上坐标 return upTime.toString("hh:mm"); //返回一个String类型 } private: QTime baseTime; //在构造函数进行初始化 }; 定时器槽函数2S调用以下代码 ui->qwtPlot->setAxisScaleDraw(QwtPlot::xBottom,new TimeScaleDraw(m_baseTime) ); 那这个方法类似于QTableWidget那样,qwt内部也有管理机制么?!有点疑惑
Acuity. 2017-11-14
  • 打赏
  • 举报
回复
Qt new内存自动回收规则: 1、必须是QObject的子类; 2、指定父类对象,即是父类释放时自动释放子类; 好的习惯就是new和delete成对出现,确保万无一失!
dext 2017-11-13
  • 打赏
  • 举报
回复
不会,这个被QTableWidget自动管理了。

16,173

社区成员

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

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