如何縮小原因以找出此Visual Leak Detector輸出中報告的內存泄漏原因?如何解釋或縮小此可視泄漏檢測器輸出中內存泄漏的原因?
問題不在於爲我調試這個特定的代碼,而在於如何處理這樣的問題。視覺泄漏檢測器報告了許多泄漏,像這樣的問題在這裏非常頻繁,所以我希望這個問題的答案不那麼具體,但更一般,這樣不僅有助於解決這個問題,而且更多的解決問題。
---------- Block 305 at 0x00000000FCBFBBB0: 64 bytes ----------
Leak Hash: 0x7DAD966C, Count: 1, Total 64 bytes
Call Stack (TID 11728):
ucrtbased.dll!malloc()
e:\programme (x86)\microsoft visual studio 14.0\vc\include\xmemory0 (901): Shady.exe!std::_Wrap_alloc<std::allocator<std::_List_node<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::unique_ptr<Texture,std::default_delete<Texture> > >,void * __ptr64> > >::allocate()
e:\programme (x86)\microsoft visual studio 14.0\vc\include\list (730): Shady.exe!std::_List_alloc<std::_List_base_types<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::unique_ptr<Texture,std::default_delete<Texture> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,st() + 0x19 bytes
e:\programme (x86)\microsoft visual studio 14.0\vc\include\list (716): Shady.exe!std::_List_alloc<std::_List_base_types<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::unique_ptr<Texture,std::default_delete<Texture> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,st()
e:\programme (x86)\microsoft visual studio 14.0\vc\include\list (631): Shady.exe!std::_List_alloc<std::_List_base_types<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::unique_ptr<Texture,std::default_delete<Texture> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,st() + 0xC bytes
e:\programme (x86)\microsoft visual studio 14.0\vc\include\list (818): Shady.exe!std::_List_buy<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::unique_ptr<Texture,std::default_delete<Texture> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > con()
e:\programme (x86)\microsoft visual studio 14.0\vc\include\list (896): Shady.exe!std::list<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::unique_ptr<Texture,std::default_delete<Texture> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,s()
e:\programme (x86)\microsoft visual studio 14.0\vc\include\xhash (197): Shady.exe!std::_Hash<std::_Umap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::unique_ptr<Texture,std::default_delete<Texture> >,std::_Uhash_compare<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::hash<std() + 0x1A bytes
e:\programme (x86)\microsoft visual studio 14.0\vc\include\unordered_map (119): Shady.exe!std::unordered_map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::unique_ptr<Texture,std::default_delete<Texture> >,std::hash<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::equal_to<std::basic_string()
e:\repositories\shady\src\texture\texturemanager.h (39): Shady.exe!TextureManager::TextureManager() + 0x44 bytes
e:\repositories\shady\src\engine.h (53): Shady.exe!Engine::Engine() + 0x65 bytes
e:\repositories\shady\src\engine.cpp (97): Shady.exe!main() + 0x1D bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (75): Shady.exe!invoke_main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (264): Shady.exe!__scrt_common_main_seh() + 0x5 bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (309): Shady.exe!__scrt_common_main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp (17): Shady.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x22 bytes
ntdll.dll!RtlUserThreadStart() + 0x34 bytes
Data:
B0 BB BF FC B4 01 00 00 B0 BB BF FC B4 01 00 00 ........ ........
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........
engine.cpp 97
是Engine engine = Engine();
它構建這個類的對象
class Engine{
Engine() : _logger("Engine"){}
TextureManager _textureManager;
Logger mutable _logger;
};
而texturemanager.h 39
是這個類的TextureManager() :_logger("TextureManager"){};
:
class TextureManager{
TextureManager() :_logger("TextureManager"){};
~TextureManager() {
for (const auto& kv : _textures) {
GLuint h = kv.second->getTextureHandle();
glDeleteTextures(1, &h);
}
}
std::unordered_map<std::string, std::unique_ptr<Texture>> _textures;
Logger mutable _logger;
};
我是否正確,所述unordered_map導致瞭解輸出泄漏?由於我試圖完全移至shared
和unique pointers
,因此沒有與此代碼中涉及的new
或malloc
直接分配。可以將字符串傳遞給構造函數並重用並存儲在類中的問題?從我讀的std :: string確實管理自己的內存。
你有沒有機會在你的記錄器中有一個'unordered_map'?如果是這樣,那麼如何清理? –
不,但上面的TextureManager有一個無序的地圖。我沒有清理unordered_map本身,因爲我希望它能夠正確清理,或者我錯了嗎? – NoxMortem
假設你的'TextureManager'本身被破壞(這大概發生在'Engine'被破壞,那麼'unordered_map'也應該得到清理。 –