【发布时间】: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