找回密码
 立即注册
收起左侧

一个有关于Qt内存管理的奇葩问题

11
回复
12294
查看
[复制链接]
累计签到:595 天
连续签到:1 天
来源: 2014-4-18 16:22:19 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 sywh 于 2014-4-18 16:35 编辑

.h
QString fileName,fileNameBackup;
QMovie *move;
比如我在一个槽函数里显示一张图片原始代码为:
static int times=0;
    fileName=QFileDialog::getOpenFileName( this,tr("打开文件"),".",tr("任何文件(*.*);;文本文件(*.txt);;XML文件(*.xml);;Images (*.png *.xpm *.jpg)"));
    move=new QMovie(fileNameBackup);
    times++;
    ui->label_3->setText("open pic_"+QString::number(times,10)+"_times");
    ui->label->setMovie(move);
    move->start();


更改后的代码:
    static int times=0;
    fileName=QFileDialog::getOpenFileName( this,tr("打开文件"),".",tr("任何文件(*.*);;文本文件(*.txt);;XML文件(*.xml);;Images (*.png *.xpm *.jpg)"));
    fileNameBackup=fileName;
    if(fileName!=NULL)
    {
        fileNameBackup=fileName;
        ui->lineEdit->setText(fileName);
        if(times>0)
            delete move;//防止内存泄露
    }
    move=new QMovie(fileNameBackup);
    times++;
    ui->label_3->setText("open pic_"+QString::number(times,10)+"_times");
    //ui->label->move(50,100);
    ui->label->setMovie(move);
    move->start();
    //delete move;
可以看出如果只按照原始代码来处理的话,如果非常频繁的打开图片的话,内存泄露很严重,我测试的图片只有337*214的分辨率。但是后面的代码就基本没什么变化了。
不能在move->start();后面Delete move,一delete图片就不显示了。不知道各位有什么好的处理办法麻烦分享一下,谢谢。   
另外一个问题,每日图片上传限制大小在1M好麻烦,像我今天的图片截大点就上传不了了。这个能不能改一下?谢谢管理
@yafeilinux @Syylc120317 @Joey_Chan

附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

这里的代码想实现什么功能呢?不会是只想用来测试内存泄露的吧。 对于附件限制为1M,这个是根据等级来定的。http://www.qter.org/forum.php?mod=viewthread&tid=3 上传图片最好截图为jpg或gif格式的,太大的图片会影响访问效果的。
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-4-18 16:22:20 显示全部楼层
这里的代码想实现什么功能呢?不会是只想用来测试内存泄露的吧。


对于附件限制为1M,这个是根据等级来定的。http://www.qter.org/forum.php?mod=viewthread&tid=3
上传图片最好截图为jpg或gif格式的,太大的图片会影响访问效果的。
回复

使用道具 举报

尚未签到

2014-4-18 17:40:05 显示全部楼层
可以在文档里面看看deleteLater函数的用法,这个是Qt唯一的自动内存管理
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-4-18 20:53:30 显示全部楼层
这个上传大小限制1MB,是为了节省资源。这个问题,我没有权限。@yafeilinux
回复

使用道具 举报

累计签到:595 天
连续签到:1 天
2014-4-19 10:25:52 显示全部楼层
Joey_Chan 发表于 2014-4-18 17:40
可以在文档里面看看deleteLater函数的用法,这个是Qt唯一的自动内存管理

像我上面那样稍微处理下会不会有好处,或者有坏处?
回复

使用道具 举报

累计签到:595 天
连续签到:1 天
2014-4-19 10:34:07 显示全部楼层
Joey_Chan 发表于 2014-4-18 17:40
可以在文档里面看看deleteLater函数的用法,这个是Qt唯一的自动内存管理

另外这种槽函数里开辟的空间我也不能在槽函数里调用deletelater,如果调用了上面的图片一样不显示了
回复

使用道具 举报

累计签到:595 天
连续签到:1 天
2014-4-19 10:38:26 显示全部楼层
Syylc120317 发表于 2014-4-18 20:53
这个上传大小限制1MB,是为了节省资源。这个问题,我没有权限。@yafeilinux

可以讨论下我发的问题吗,应该怎么处理?
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-4-19 19:53:23 显示全部楼层
sywh 发表于 2014-4-19 10:38
可以讨论下我发的问题吗,应该怎么处理?

嗯,我们商量一下。
回复

使用道具 举报

累计签到:595 天
连续签到:1 天
2014-4-21 11:18:40 显示全部楼层
yafeilinux 发表于 2014-4-20 22:37
这里的代码想实现什么功能呢?不会是只想用来测试内存泄露的吧。

我目的是在label上显示一张打开对话框里打开的图片,在做的时候突然想到如果一个人不停的打开会导致什么问题,就有了上面的测试。这个问题应该怎么解决呢?
回复

使用道具 举报

累计签到:595 天
连续签到:1 天
2014-4-22 13:56:55 显示全部楼层
这个就这么沉了?难道就我一个人这么无聊?
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-4-22 15:16:18 显示全部楼层
sywh 发表于 2014-4-21 11:18
我目的是在label上显示一张打开对话框里打开的图片,在做的时候突然想到如果一个人不停的打开会导致什么 ...

其实这个不是图片显示的问题,而是一个写代码的规范问题。

比如,如果一个部件是一直使用的,那么就不要在按钮点击槽中多次创建它,可以放到构建函数中去创建一次即可。另外,一个movie正在播放,如果要更换其内容,最好先停止,再修改文件,再开始。还有向label中设置movie的操作,也只需要在构造函数中执行一次即可,这些初始化操作都放到构造函数中。


上面的代码可以这样写:

//构造函数中
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    move=new QMovie(this);
    ui->label->setMovie(move);
}

按钮点击信号槽中:

void MainWindow::on_pushButton_clicked()
{
        move->stop();

        fileName=QFileDialog::getOpenFileName( this,tr("打开文件"),".",tr("任何文件(*.*);;文本文件(*.txt);;XML文件  (*.xml);;Images (*.png *.gif *.jpg)"));

        move->setFileName(fileName);

        move->start();
}
回复

使用道具 举报

累计签到:595 天
连续签到:1 天
2014-4-22 15:27:13 显示全部楼层
yafeilinux 发表于 2014-4-22 15:16
其实这个不是图片显示的问题,而是一个写代码的规范问题。

比如,如果一个部件是一直使用的,那么就不要 ...

原来是这样,多谢老大指点迷津。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了