在应用程序关闭期间,我收到一个奇怪的堆损坏错误,如果我的代码中出现“std::vector”,并且我删除了“ref_count”变量。如果我没有std::vector,就不会崩溃。如果有一个std::vector,并且我没有删除ref_count(导致内存泄漏),那么就会发生堆崩溃。我使我的测试用例尽可能小,但是不幸的是它在这里太大了,所以它位于http://codepad.org/USIPjPHJ。有人对可能出现的问题有任何建议吗?
我的输出窗口中会出现此异常,并且出现堆异常。
HEAP [CrashTest.exe]:HEAP:免费堆块6d4c30在释放后在6d4c58修改
Windows在CrashTest.exe中触发了一个断点。
这可能是由于堆损坏所致,这表明CrashTest.exe或其已加载的任何DLL中均存在错误。
这也可能是由于CrashTest.exe具有焦点时用户按下F12所致。
输出窗口可能包含更多诊断信息。
我的IDE是Visual Studio 2010 SP1(也曾在非SP1上试用过),但这不应引起问题。
最佳答案
这行:
strong_ref<int> reg1;
将* ref_count设置为0(因为ptr == NULL),则此行:
strong_ref<int> copy1(reg1);
将* ref_count递增为1。
在退出时,析构函数被调用两次(一次对reg1,一次对copy1)。第一次,* ref_count递减为0,并释放ref_count,第二次留下悬挂的引用。