【发布时间】:2017-01-31 18:48:06
【问题描述】:
抱歉标题不好,但我只是好奇究竟是什么内存泄漏,我真的可以说我在我的程序中做了一些坏事。
我在 Visual Studio (_CrtDumpMemoryLeaks()) 中运行了内存泄漏测试,它会输出大量检测到的泄漏列表(仅显示一小部分):
{1640} normal block at 0x081C2AB0, 4 bytes long.
Data: <; > 3B 00 00 00
{789} normal block at 0x08B792E8, 12 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00
{788} normal block at 0x027E62D8, 32 bytes long.
Data: < L L > 20 A8 FE 07 A0 A0 17 08 E4 4C F3 07 D8 4C F3 07
{787} normal block at 0x027E6328, 32 bytes long.
Data: <layer03 - Object> 6C 61 79 65 72 30 33 20 2D 20 4F 62 6A 65 63 74
{786} normal block at 0x08B79748, 8 bytes long.
Data: <`N > 60 4E F3 07 00 00 00 00
我真的不知道我到底做错了什么。我遵循了来自 another question of mine 的提示,并用 智能指针 替换了所有 new/delete 的东西(或者至少我认为我这样做了)。
我问的原因是,因为我在运行程序时遇到了内存大小和堆大小的增加,我不确定这是一个严重的问题还是只是某种基本行为。
以我的(自己写的)gui为例:
std::shared_ptr<Gui_Button> gui_modal_window_map_saved_button;
我现在称它为:
gui_modal_window_map_saved_button.reset(new Gui_Button(res_handler, "Select", 20, 345, 70, 40, BUTTON_CONFIRM));
已被告知是内存安全的。现在,有些事情我不太确定——我现在如何安全地删除按钮?我知道,没有什么能像使用智能指针删除一样,但我想在不再需要按钮时删除按钮,即在相应的窗口关闭之后。
目前我正在使用reset()“删除”我的按钮
if (g_ev.event_id == EVENT_CLICKED && g_ev.element == gui_modal_window_map_saved_button.get()) {
gui_modal_window_map_saved.reset();
gui_modal_window_map_saved_button.reset();
}
我认为这没问题,但为什么每次创建“新”按钮时我的内存大小都会增加(而不是再次减少)?
回到原来的问题
我通过 Visual Studio 获得了这些内存泄漏转储,但我真的不知道如何使用这些信息。究竟是什么导致了内存泄漏?我现在只使用“普通”指针,我需要将某些东西传递给另一个类,即用智能指针替换所有new/deletes。我真的无法显示我的代码,因为到目前为止它大约有 3000 行..
那么,究竟是什么导致了内存泄漏以及如何使用 VS 提供的信息呢?
【问题讨论】:
-
这是一个一般性问题?
-
内存泄漏与硬件无关,除非您将笔记本电脑放在雨中...
-
灰色区域。我想说内存泄漏是一个普遍的问题。
-
“我现在只使用“普通”指针,我需要将某些东西传递给另一个类” - 听起来你应该改用引用。
标签: c++ visual-studio memory-leaks