gpt4 book ai didi

c++ - 新的/免费的行为非常奇怪

转载 作者:行者123 更新时间:2023-11-30 21:21:29 32 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。我的应用程序的 Release 版本似乎运行良好,但最近当我切换到 Debug 版本时,我在启动时立即遇到访问冲突。当释放分配的内存块时,就会发生访问冲突。所有这些都发生在静态变量的构造函数中。

我相信在 Release 版本中不会出现问题,因为我在那里定义了 NDEBUG,我相信这会在 C 运行时禁用断言。

我已经能够缩小范围了。如果我在通常的调用之前将以下代码添加到构造函数中,则会收到相同的错误:

int *temp = new int[3];
delete[] temp;

这让我认为该代码块之外的某些内容导致了问题,例如,C 运行时的链接方式可能存在问题。然而,我不知道这个问题可能是什么,并且在研究了这个问题一天之后,我已经不知道下一步该在哪里研究了。

任何帮助将不胜感激。我正在使用 Visual Studio 2010 编译应用程序并运行 Windows 7。

非常感谢!

最佳答案

在 Debug模式下,添加了额外的检查;因此,程序在 Release模式下运行良好但在 Debug模式下出现访问冲突的情况并不罕见。这并不意味着Release版本就可以了;这仅意味着在Release版本运行时发生的某些错误未被捕获,但在Debug模式下运行时发生。

在 C/C++ 中调试损坏的内存问题非常困难,因为影响内存的任何其他指令都可能导致错误。例如,如果在分配的内存中有两个彼此相连的数组,并且第一个数组溢出,那么它将损坏第二个数组之前放置的 header (每个内存分配都以 header 为前缀;该 header 由释放内存时操作符delete和delete[])。但是,只有当您尝试释放第二个数组时,才会发生访问冲突,即使是第一个数组,代码中也会出现错误。

当然,第二个数组可能会出现其他问题。例如,当您尝试读取它时,您可能会发现它的部分或全部值已被损坏。然而,情况并非总是如此,在许多情况下,它在读取或写入时可能表现得非常好,并且您可以使用第一个数组获得完全相同的良好行为。这并不是因为您在读取和写入某些数组时没有任何问题,而是因为您没有超越其边界并损坏其上方(或下方)的内存。有时,问题只会在尝试释放数组时出现,而其他时候,问题才会出现;例如显示损坏的值。

关于c++ - 新的/免费的行为非常奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924029/

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