• 9547阅读
  • 14回复

貌似是内存泄漏的问题 [复制链接]

上一主题 下一主题
离线fox1987
 
只看楼主 倒序阅读 楼主  发表于: 2010-04-06
我用Phonon+QT来开发视频播放的程序

目前写个很简单的代码测试:
大概就是
成员:
Phonon::MediaObject *m_MediaObject;
Phonon::VideoWidget *m_VideoWidget;
Phonon::AudioOutput *m_AudioOutput;
QTimer m_Timer;


然后在初始化函数中:

   m_MediaObject = new Phonon::MediaObject();
  
    m_VideoWidget = new Phonon::VideoWidget();
    Phonon::createPath(m_MediaObject, m_VideoWidget);

    m_AudioOutput =new Phonon::AudioOutput(Phonon::VideoCategory, this);
     Phonon::createPath(m_MediaObject, m_AudioOutput);

    m_Timer.setInterval(5000);
    connect(&m_Timer,SIGNAL(timeout()),this,SLOT(playNext()));
    m_VideoWidget->show();

playNext()就是
m_MediaObject->setCurrentSource(Phonon::MediaSource("1.avi"));
m_MediaObject->play();


程序完成的功能就是每次播放一个视频,定时器控制播放时长,超时后重新播放下一个。。
目前写的是同一个。。
但是发现程序执行起来内存越来越大,一天下来有几十M的内存增长。。。
不知道是怎么回事,有知道的没啊?

离线joiky
只看该作者 1楼 发表于: 2010-04-06
new时需增加参数"this"。
e.g.
  m_MediaObject = new Phonon::MediaObject(this);
这样,父窗口才能保存new出来的成员,在退出时释放内存,如果不加"this",new出来的内存将“泄露”了~~
离线fox1987
只看该作者 2楼 发表于: 2010-04-06
引用第1楼joiky于2010-04-06 13:10发表的  :
new时需增加参数"this"。
e.g.
  m_MediaObject = new Phonon::MediaObject(this);
这样,父窗口才能保存new出来的成员,在退出时释放内存,如果不加"this",new出来的内存将“泄露”了~~



主要是我程序没有退出。。一直循环的播放呢,。。。。
离线xtfllbl

只看该作者 3楼 发表于: 2010-04-06
使用valgrind检测一下,是个不错的检测程序
上海欢迎您
离线fox1987
只看该作者 4楼 发表于: 2010-04-06
引用第3楼xtfllbl于2010-04-06 14:20发表的  :
使用valgrind检测一下,是个不错的检测程序

检测过
不过检测出来的都指向库文件了。。
所以我觉得可能是我使用不当导致的。。
可是qt Assistant提供的例子就这样。。
没说如果上一个没播完 再添加一个应该怎么样处理。。。
我也不知道怎么用了。。。
离线wato
只看该作者 5楼 发表于: 2010-04-06
初始化函数只执行一次吧   那问题应该在playnext()中咯
离线wato
只看该作者 6楼 发表于: 2010-04-06
Phonon::MediaSource("1.avi")

这里每次都建一个对象阿
离线xtfllbl

只看该作者 7楼 发表于: 2010-04-06
不要迷信库,库也是会泄漏的,只是不会那么多而已。
上海欢迎您
离线fox1987
只看该作者 8楼 发表于: 2010-04-07
引用第5楼wato于2010-04-06 16:36发表的  :
初始化函数只执行一次吧   那问题应该在playnext()中咯



恩 初始化只执行了一次。。
离线fox1987
只看该作者 9楼 发表于: 2010-04-07
引用第6楼wato于2010-04-06 16:40发表的  :
Phonon::MediaSource("1.avi")
这里每次都建一个对象阿



是 但是是一个局部对象啊。。。
我觉得应该超过生命周期会自动释放的啊。。
但是我就是不知道什么时候会释放。。。


因为我试过如果不是用计时器,而是用MediaObject的finished信号连接playNext则不会内存增大。。
但是如果我继承了MediaObject类,然后把finished信号公有化,然后我在定时器超时后去发射这个finished信号。。
则仍然会内存增大。。。。
离线fox1987
只看该作者 10楼 发表于: 2010-04-07
引用第7楼xtfllbl于2010-04-06 17:11发表的  :
不要迷信库,库也是会泄漏的,只是不会那么多而已。



我这个使用起来还是不小的。。
如果我定时器间隔设置为5s的话
一天下来能增大个40-60M的内存呢。。。
还是很夸张的。。。。
离线fox1987
只看该作者 11楼 发表于: 2010-04-07
而且以前这个不只是引发了内存增大。。、、
而且在后面执行,媒体文件载入的时间也越来越长。。。
就是我用MediaObject的StateChanged 来判断从Loading到Stopped(Assistant上面说就是从载入到载入完成)
的时间越来越大。差不多两个小时增长1s
离线fox1987
只看该作者 12楼 发表于: 2010-04-07
有么有知道怎么解决的啊
离线leafies
只看该作者 13楼 发表于: 2011-08-11
几十m 不是问题吧!

每次新建对象内存自然会增加,在你new 对象前,之前的还没有释放掉, 所以会一直累加 !·

不过几十 m  没问题 !~
离线y286572046

只看该作者 14楼 发表于: 2011-08-11
看你变量定义方式,就知道你习惯用MFC
快速回复
限100 字节
 
上一个 下一个