C++ 内存错误及相关问题

C++ 内存错误及相关问题,c++,memory-management,C++,Memory Management,啊!我想我有一个模糊的记忆错误。但我不确定。有可能这甚至不在我的代码中。我正在测试一个C++应用程序在MS VC++ 2005上。现在,我的代码抛出了一个异常,并由于一个看似无害的向量推回中的一些堆错误而中断: std::vector<int> blah; for(int i=0; i<somesize; ++i) { blah.push_back(0); } 无论我将这段代码移到哪里,失败都会在推回时发生。这太疯狂了!我确信这种用法没有违法之处。而且,当我把它评论出来

啊!我想我有一个模糊的记忆错误。但我不确定。有可能这甚至不在我的代码中。我正在测试一个C++应用程序在MS VC++ 2005上。现在,我的代码抛出了一个异常,并由于一个看似无害的向量推回中的一些堆错误而中断:

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::FileIEException吗?我们确实链接到它作为第三方DLL

你发布的代码很好。内存损坏可能发生在其他地方,而推回只会暴露它。 nil将不会被删除。每次使用push_back时,指针的一个副本都会被推入向量中。唯一被删除的是包含指针所有副本的内部数组。 你发布的代码很好。内存损坏可能发生在其他地方,而推回只会暴露它。 nil将不会被删除。每次使用push_back时,指针的一个副本都会被推入向量中。唯一被删除的是包含指针所有副本的内部数组。
通常,在遇到堆损坏时,您应该做的第一件事是启用某种形式的调试malloc,大多数平台都有这样的功能

在VC++2005上,显然您可以定义调试。这将malloc转换为,其中包括调试信息,如文件/行和填充,以检查缓冲区溢出/不足。另见

编辑:如果这没有帮助,而且通常没有帮助,您可以使用调试malloc,在每次分配后放置一个保护页,例如,或OSX的libgmalloc。默认情况下,这不会在调试构建时启用,因为每次分配的开销高达~8K,但会使调试问题更快,并捕获错误访问,而不是随后调用malloc/free/heap checking函数


我最近修复了一个我已经忍受多年的每周崩溃,可能超过十年!我不确定我之前怎么没有想到要这么做,因为我对libgmalloc了解的时间几乎和以前一样长,并且在工作中使用它来调试堆损坏。

一般来说,遇到堆损坏时,首先应该做的是启用某种形式的调试malloc,大多数平台都有这样的功能

在VC++2005上,显然您可以定义调试。这将malloc转换为,其中包括调试信息,如文件/行和填充,以检查缓冲区溢出/不足。另见

编辑:如果这没有帮助,而且通常没有帮助,您可以使用调试malloc,在每次分配后放置一个保护页,例如,或OSX的libgmalloc。默认情况下,这不会在调试构建时启用,因为每次分配的开销高达~8K,但会使调试问题更快,并捕获错误访问,而不是随后调用malloc/free/heap checking函数


我最近修复了一个我已经忍受多年的每周崩溃,可能超过十年!我不确定我之前怎么没有想到要这么做,因为我知道libgmalloc的时间几乎与libgmalloc一样长,并且在工作中使用它来调试堆损坏。

请给每篇文章一个问题主题……容器中的裸指针必须明确删除,因此需要智能指针。调试显示了什么?为什么要推回,而不是推回?你需要一个。发布的代码没有问题,因此没有人可以帮助您不疯狂猜测。很有可能在试图缩小到这样一个示例的范围时,您自己会发现这个问题。您能最小化代码吗?也就是说,在不改变不良行为的情况下,尽可能地删除所有其他内容。最终,你要么找到bug,要么得到足够小的东西发布。对于第二个问题,不,它不应该试图删除指向的对象。我的一个同事在迭代向量时遇到了非常类似的问题。。。事实证明,前一个函数调用是对外部库的,并且在中声明调用的头指定了错误的调用约定,这对堆栈造成了严重破坏。因此,它可能与向量完全无关。请在每篇文章中添加一个问题主题…容器中的裸指针必须明确删除,因此需要智能指针。调试显示了什么?为什么要推回0,而不是
推开?你需要找一份工作。发布的代码没有问题,因此没有人可以帮助您不疯狂猜测。很有可能在试图缩小到这样一个示例的范围时,您自己会发现这个问题。您能最小化代码吗?也就是说,在不改变不良行为的情况下,尽可能地删除所有其他内容。最终,你要么找到bug,要么得到足够小的东西发布。对于第二个问题,不,它不应该试图删除指向的对象。我的一个同事在迭代向量时遇到了非常类似的问题。。。事实证明,前一个函数调用是对外部库的,并且在中声明调用的头指定了错误的调用约定,这对堆栈造成了严重破坏。所以它可能是与向量完全无关的东西,不过你能说得更具体一点吗。我应该在哪里定义调试?这难道不等同于在调试模式下运行吗?i、 例如,在调试中运行时应该自动设置这样一个预编译指令,不是吗?我刚刚试过这个。。它并没有给我比我看到的更多的信息,事实上,我知道了如何做这个正确的项目->属性->C/C++->预处理定义;此外,我还必须在主define中添加include和预处理器定义_CRTDBG_MAP_ALLOC include和对_crtdumpmomeryleaks的调用;但我没有得到s行等的详细输出。。有什么想法吗?我希望它出现在空闲堆块附近。。。修改于。。。释放该块后,会显示一条消息,但在释放该块时,可能会清除文件/行信息。答案经过编辑,包括了杜马。不过,你们能说得更具体一点吗。我应该在哪里定义调试?这难道不等同于在调试模式下运行吗?i、 例如,在调试中运行时应该自动设置这样一个预编译指令,不是吗?我刚刚试过这个。。它并没有给我比我看到的更多的信息,事实上,我知道了如何做这个正确的项目->属性->C/C++->预处理定义;此外,我还必须在主define中添加include和预处理器定义_CRTDBG_MAP_ALLOC include和对_crtdumpmomeryleaks的调用;但我没有得到s行等的详细输出。。有什么想法吗?我希望它出现在空闲堆块附近。。。修改于。。。释放该块后,会显示一条消息,但在释放该块时,可能会清除文件/行信息。答案经过编辑,包括杜马。