我现在使用 valgrind 和 memcheck 来检测程序中潜在的内存错误,在报告中我发现了以下信息:
Invalid read of size 8
at Ox4310557: __wcslen_sse2 (wcslen-sse2.S:85)
by myclass:perform_functionality( **.cpp:59)
by 0x8074656: main (main.cpp:83)
Address 0x4a46530 is 8 bytes after a block of size 176 alloc'd
at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
by 0x420B386: std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_S_create(unsigned int, unsigned int, std::allocator<wchar_t> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
by 0x420C68F: std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_M_clone(std::allocator<wchar_t> const&, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
by 0x420C7BD: std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>::reserve(unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
by 0xE29AFF: ???
和
Conditional jump or move depends on uninitialised values(s)
at 0x4310578: __wcslen_sse2 (wcslen-sse.s:95)
然而,要找出泄漏点是非常困难的。看起来该消息与 std::string 有关,但我不确定。内存使用情况摘要如下:
HEAP SUMMARY:
==2302== in use at exit: 0 bytes in 0 blocks
==2302== total heap usage: 87,293 allocs, 87,293 frees, 427,491,963 bytes allocated
所以我的问题是:我应该忽略与 __wcslen_sse2 相关的消息吗?谢谢。
编辑: 我发现如果我删除函数中的以下代码,所有消息都会消失:
std::cout<<"Writing....."<<std::endl;
std::wcout<<imageFileName.c_str()<<std::endl;
这证实了我的猜测,这种消息来自
std::wstring
。那么为什么拨打 .c_str()
会引起这些信息的兴趣呢?顺便说一句,imageFileName是类的成员变量,在使用该类之前设置。
首先我编辑了这个问题,因为它问的是“泄漏”。正如 Kerrek SB 在评论中指出的那样,这个问题与泄漏完全没有任何关系。
为了将来参考,与泄漏相关的错误包含“loss”和“lost”一词(但不幸的是不是工作“leak”)。如果错误消息没有提到loss/lost,那么它不是泄漏。
回到问题本身。你的 Valgrind 太旧了。 Valgrind 需要重定向
wcslen
(因为 SIMD 优化可能会故意安全地读取字符串末尾,因为知道内存将以 8 或 16 字节的倍数分配)。 wcslen
重定向于 2013 年添加。