gpt4 book ai didi

c++ - 由于 malloc (C++),ntdll.dll 出错

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:31 25 4
gpt4 key购买 nike

我在我的程序中遇到了这个错误,我以前从未见过。

这是负责的代码部分:

double *xx;
xx = (double*) malloc(2*n*m*sizeof(double));

以及调试时的Visual Studio 2010提示文字:

Windows has triggered a breakpoint in calib.exe.

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

This may also be due to the user pressing F12 while calib.exe has focus.

The output window may have more diagnostic information.

我对 C++ 有一点经验,对我来说这只是一个简单的内存分配,仅此而已。是什么导致了这个错误?上面几行我也为 double 做了一个 malloc,没问题...

谢谢你的帮助,

克莱门特

最佳答案

正如@Dewfy 和@molbdnilo 所说,您收到此错误的原因很可能与调用站点无关,而是程序中在此之前发生的事情。

malloc/free(以及相应的 C++ new/delete)依靠堆中的数据结构来跟踪哪些内存已分配,哪些是空闲的。这因一个实现而异,但通常涉及每个分配区域开始和/或结束的数据结构——通常是链表等。

可以破坏这些结构并导致此类错误的错误种类包括:

  • 在已分配区域的结尾或开头之前写入数据
  • 为同一内存调用 free 两次
  • 尝试释放一开始未分配的内存块(例如,在指向已分配 block 的一半的指针上调用 free)
  • 在通过 new 分配的内存上调用 free,反之亦然
  • 其他杂散指针场景

并非以上所有都会破坏堆,这在很大程度上取决于实际的实现。我实际上对 Windows 堆管理器不是很熟悉。此外,上面的列表并不详尽。

众所周知,此类问题很难发现,因为故障可能会在问题代码执行后的相当长一段时间内发生。

如果您使用的是类 unix 平台,我会推荐 valgrind查找此类问题的工具。似乎正在努力将其移植到 Windows,但看起来并不完整。如果您的程序不是特定于 Windows 的,并且您可以访问 Linux 机器,您可能想在那里尝试一下,如果遇到类似的问题,请尝试使用 Valgrind 来捕获它。

但是我确实找到了'Dr Memory ' 看起来很有前途的 Windows 工具(尽管仅限于 32 位代码)。

顺便说一句,这个问题被标记为 C++,但您使用的是 C 堆管理函数。虽然您可以在 C++ 中使用它们,但最好改用 new 和 delete。但无论您使用什么,都不要混合使用它们 - 这会导致未定义的行为。

关于c++ - 由于 malloc (C++),ntdll.dll 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24183982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com