【问题标题】:QImage constructor memory leak (valgrind)QImage 构造函数内存泄漏(valgrind)
【发布时间】:2013-01-12 08:21:55
【问题描述】:

我有一个使用一些 Qt 类的控制台程序。以下代码是它的片段

std::cout << "before the problem (PVM constructor)" << std::endl;
image = new QImage(filename);
std::cout << "after the problem (PVM constructor)" << std::endl;

针对 valgrind 运行它会引发一些错误:

before the problem (PVM constructor)
==8344== Conditional jump or move depends on uninitialised value(s)
==8344==    at 0x51D6D19: inflateReset2 (in /lib/i386-linux-gnu/libz.so.1.2.3.4)
==8344==    by 0x51D6E0C: inflateInit2_ (in /lib/i386-linux-gnu/libz.so.1.2.3.4)
==8344==    by 0x51D6E92: inflateInit_ (in /lib/i386-linux-gnu/libz.so.1.2.3.4)
==8344==    by 0x51B3F60: png_create_read_struct_2 (in /lib/i386-linux-gnu/libpng12.so.0.46.0)
==8344==    by 0x42807AC: QImageReader::read(QImage*) (in /usr/lib/i386-linux-gnu/libQtGui.so.4.7.4)
==8344==    by 0x4021BAF: ???
==8344==  Uninitialised value was created by a heap allocation
==8344==    at 0x4028876: malloc (vg_replace_malloc.c:236)
==8344==    by 0x51C0796: png_malloc_default (in /lib/i386-linux-gnu/libpng12.so.0.46.0)
==8344==    by 0x51C082C: png_malloc (in /lib/i386-linux-gnu/libpng12.so.0.46.0)
==8344==    by 0x51A6A48: ??? (in /lib/i386-linux-gnu/libpng12.so.0.46.0)
==8344==    by 0x51D6DE8: inflateInit2_ (in /lib/i386-linux-gnu/libz.so.1.2.3.4)
==8344==    by 0x51D6E92: inflateInit_ (in /lib/i386-linux-gnu/libz.so.1.2.3.4)
==8344==    by 0x51B3F60: png_create_read_struct_2 (in /lib/i386-linux-gnu/libpng12.so.0.46.0)
==8344==    by 0x42807AC: QImageReader::read(QImage*) (in /usr/lib/i386-linux-gnu/libQtGui.so.4.7.4)
==8344==    by 0x4021BAF: ???
==8344== 
after the problem (PVM constructor)

您能帮我找出问题的原因吗?可能是内部 Qt 库有一些危险的结构 - 还是在控制台程序中使用 Qt GUI 库的问题(不这么认为,但谁知道)?

【问题讨论】:

  • 你删除那个指针吗?
  • 我 100% 确定在构造函数执行期间捕获了此错误,因此与析构函数无关...
  • 我认为您不了解内存泄漏的含义。看看我的回答,希望对你有帮助。
  • 这不是内存泄漏,而是未初始化的值。请注意,您应该在堆栈上创建 QImage,它是隐式共享的。

标签: image qt valgrind memory-leaks


【解决方案1】:

Valgrind 会告诉您它是否发现内存泄漏,例如当您在堆上分配内存但您从未释放它时。我猜你只是在你的程序完成后不要打电话给delete image。这是 valgrind 将作为内存泄漏处理的东西。它与Qt无关。 C++ 中的规则是:每新增 1 次删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2013-06-24
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    相关资源
    最近更新 更多