内存bug和相关

时间:2012-06-12 16:56:02

标签: c++ memory-management

唉!我想我有一个不起眼的内存错误。但我不确定。有可能它甚至不在我的代码中。我正在MS VC ++ 2005上测试一个(C ++)应用程序。现在,我的代码抛出一个异常,并在看似无害的向量推回时由于一些堆错误而中断:

std::vector<int> blah;
for(int i=0; i<somesize; ++i) {
   blah.push_back(0);
}

无论我在何处移动此段代码,故障都会在推回时发生。这太疯狂了!我确信这种用法没有任何违法行为。此外,当我发表评论时,它没有任何问题。它上面和下面我有其他载体,我可以加载没有任何麻烦。与此相关我还有另外一个问题:

std::vector<double*> wha;
wha.push_back(nil);
..
... 
wha[0] = some pointer I create;

我的问题是:当wha超出范围时,它不应该删除指针,对吧?我认为我是对的,但最好澄清一下。对不起,没有太多细节,但如果有任何其他细节有帮助,请告诉我,我会尝试发布更多内容。感谢。

编辑:

确切的错误消息是:

First-chance exception at 0x771b70cd in myprogram_run.exe: Microsoft C++ exception: 
H5::FileIException at memory location 0x08026ca0..
First-chance exception at 0x771b70cd in myprogram_run.exe: Microsoft C++ exception: 
H5::FileIException at memory location 0x08026ca0..
'myprogram_run.exe': Loaded 'C:\Windows\System32\wdmaud.drv', No symbols loaded.
...
...
''myprogram_run.exe': Unloaded '<path\to>\bin\win64-x64-vs2005.shared\tcl85.dll'
The thread 'Win64 Thread' (0x23a8) has exited with code 0 (0x0).
The thread 'Win64 Thread' (0x120c) has exited with code -1 (0xffffffff).
The thread 'Win64 Thread' (0x27bc) has exited with code -1 (0xffffffff).
...
...
HEAP[myprogram_run.exe]: HEAP: Free Heap block dfd6870 modified at dfd68d0 after it was freed
Windows has triggered a breakpoint in myprogram_run.exe.

This may be due to a corruption of the heap, and indicates a bug in myprogram_run.exe or any of 
the DLLs it has loaded.

The output window may have more diagnostic information 
The program '[3052] myprogram_run.exe: Native' has exited with code -1 (0xffffffff).

我应该关注H5 :: FileIExceptions吗?我们将它作为第三方DLL链接到它。

2 个答案:

答案 0 :(得分:3)

  1. 您发布的代码很好。内存损坏可能发生在其他地方,而push_back只是揭示它。
  2. nil不会被删除。每次使用push_back时,指针的副本都会被推入向量中。唯一被删除的是包含指针所有副本的内部数组。

答案 1 :(得分:1)

一般来说,遇到堆损坏时应该做的第一件事是启用某种形式的“调试malloc”,大多数平台都有这个。

在VC ++ 2005上,显然你只能#define _DEBUG。这将malloc()转换为_malloc_dbg(),其中包括调试信息(如文件/行)和填充以检查缓冲区溢出/欠载。另请参阅The CRT Debug Heap

编辑:如果这没有帮助(通常也没有),您可以使用调试malloc,在每次分配后放置一个“保护页面”,例如: DUMA或OSX的libgmalloc。调试版本默认情况下不会启用此功能,因为开销非常大(每次分配最多约8K),但可以更快地调试问题 (并捕获错误访问而不是后续调用malloc) ()/ free()/堆检查功能)。

(我最近修复了一次〜每周多年的 - 可能十多年了!我不确定这样做是怎么回事之前,鉴于我已经了解libgmalloc的时间差不多,并且在工作中使用它来调试堆损坏。)