冲突实例化 - 内存泄漏
conflicting instantiation - memory leak?
我一直在这些问题上潜伏一段时间,学到了很多东西,但最近遇到了一个我不明白的问题。我正在使用Qt,需要在各种类方法中创建/替换QMovie对象(最终在QLabel中设置)。我已经使用 new 关键字定义了对象。因此在标题中我有
QMovie * movie;
为简单起见,我将等效代码放在单个方法中。这相当于两行代码
QMovie * movie = new QMovie(QByteArray1,this);
QMovie * movie = new QMovie(QByteArray2,this);
这有效(我不知道为什么),但由于这是一个重复的操作,我担心内存泄漏。似乎第二个定义成功地替换了第一个定义,但由于它们可能都有不同的指针,我不知道如何删除指向第一个定义的指针。我在类析构函数中删除了电影,但不知道它是否会删除所有内容。有人知道这里发生了什么吗?
附言我这样做是因为(我在Qt中找到的)使用QByteArray(从网络下载)中的数据创建QMovie对象的唯一方法是使用QMovie构造函数。如果我只想用文件中的新数据替换当前的电影数据,则可以使用该方法
movie->setFileName(fileName);
但在使用二进制数据时,这不是一个选项。注意:QMovie还有一个构造函数,它有一个文件名而不是QByteArray作为参数。使用文件名也可以使用上面的代码,并且更容易测试。
任何帮助将不胜感激。
一般来说,如果从QObject
派生的任何内容都包含在 QObject
s 的层次结构中,则当父级被破坏时,它们会自动销毁。 在您的情况下,您通过构造函数为QMovie
提供父级,因此应该为您处理清理工作。 如果要确认,请从 QMovie 派生一个类,实现一个打印消息的析构函数,并确保在预期时(即在父级被销毁时)调用它。
在 C 语言中执行此操作的惯用方法是:
-
将指针初始化为零。
-
在分配给它之前,
free()
旧指针指向的对象。您无需检查零:free()
在零指针上是安全的无操作。 -
当指针超出范围时
free()
对象。
在Qt中执行此操作的惯用方法甚至更简单。
-
使用
QSharedPointer<>
或QScopedPointer<>
。当指向的对象超出范围时,它将自动删除它。-
如果只有一个指针应该拥有该对象,请使用
QScopedPointer
。当指向的对象超出范围时,它将删除它。这类似于std::auto_ptr
. -
对于共享所有权,请使用
QSharedPointer
。当指向该对象的最后一个QSharedPointer
超出范围/被销毁时,它将删除指向的对象。
-
-
对于
QScopedPointer
,请使用reset(T*other)
方法为指针赋值。对于QSharedPointer
,您只能为其分配其他共享指针,例如QSharedPointer a = QSharedPointer(new Class);
在任一情况下,任何以前指向的对象都将被删除。
因此:
class MyClass {
QScopedPointer<QMovie> movie1;
QSharedPointer<QMovie> movie2;
public:
MyClass {} // note: no need for any special initialization
void method() {
movie1.reset(new QMovie(...));
movie2 = QSharedPointer(new QMovie(...));
}
};
这是完全安全的。您可以根据需要随时调用MyClass::method()
,而不会发生内存泄漏。在任何时间点,MyClass 最多可以保持两个 QMovie 对象的活动状态。
QMovie * movie = new QMovie(QByteArray1,this);
QMovie * movie = new QMovie(QByteArray2,this);
如果这两行位于同一个.cc
文件中,则会出现重定义错误。如果这两行位于单独的.cc
文件中,则在生成可执行文件时,将出现多重定义错误。但是,您的问题有以下措辞:
我正在使用Qt,需要在各种类方法中创建/替换QMovie对象(最终在QLabel中设置)
如果 QMovie
对象驻留在不同的类中,则不会有内存泄漏,因为每个类的指针都与另一个类的指针不同。
但是,如果您打算所有类都引用同一个QMovie
实例,则需要找到一种方法将实例传递给每个对象。或者,您可以让它们都引用同一个(即使用单例模式)。
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存