我一直在潜伏着这些问题一段时间,并且学到了很多东西,但是最近遇到了一个我不理解的问题。我正在使用Qt,并且需要在各种类方法(最终在QLabel中设置)中创建/替换QMovie对象。我已经使用new关键字定义了对象。因此在标题中
QMovie * movie;
为简单起见,我将等效代码放在一个方法中。这等效于两行代码
QMovie * movie = new QMovie(QByteArray1,this);
QMovie * movie = new QMovie(QByteArray2,this);
这行得通(我不知道为什么),但是由于它是重复的操作,因此我担心内存泄漏。看来第二个定义成功地替换了第一个定义,但是由于大概每个定义都有不同的指针,我不知道如何删除指向第一个定义的指针。我在类析构函数中删除了影片,但不知道它是否会删除所有内容。有人知道这里发生了什么吗?
附言之所以这样做,是因为使用QByteArray(从Web下载)中的数据创建QMovie对象的唯一方法(在Qt中找到)是使用QMovie构造函数。如果我只是想用文件中的新数据替换当前的电影数据,则可以使用该方法
movie->setFileName(fileName);
但这不是使用二进制数据时的选择。注意:QMovie还具有一个构造函数,该构造函数具有文件名而不是QByteArray作为参数。使用文件名也可以使用上述代码,并且更易于测试。
任何帮助将不胜感激。
最佳答案
一般来说,如果从QObject
派生的任何内容包含在QObject
的层次结构中,则在销毁父级时会自动销毁它们。在您的情况下,您通过构造函数为QMovie
提供了一个父对象,因此清理工作应由您自己来进行。如果要确认,请从QMovie派生一个类,实现一个打印消息的析构函数,并确保在您期望的时间(即父对象被解构时)被调用。
关于c++ - 实例化冲突-内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11007029/