C++ 删除全局数组时堆损坏
每当调试器点击C++ 删除全局数组时堆损坏,c++,arrays,winapi,delete-operator,heap-corruption,C++,Arrays,Winapi,Delete Operator,Heap Corruption,每当调试器点击delete[]操作符时,以下代码似乎会导致堆损坏。它试图删除一个全局结构数组,该数组在头文件中定义为extern,然后在main.cpp文件的全局范围中声明 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: { int main_win_x, main_win_y
delete[]
操作符时,以下代码似乎会导致堆损坏。它试图删除一个全局结构数组,该数组在头文件中定义为extern
,然后在main.cpp文件的全局范围中声明
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
int main_win_x, main_win_y;
tiles_horiz = 10; //temp code
tiles_vert = 10; //temp code
num_mines = 5; //temp code
main_win_x = (tiles_horiz * 22) + 20;
main_win_y = (tiles_vert * 22) + 20;
MoveWindow(hwnd, 100, 100, main_win_x, main_win_y, TRUE);
tiles_total = (tiles_horiz * tiles_vert);
tile_array = new tile[tiles_total];
SetupPlayField();
DrawInitTiles(hwnd);
}
break;
case WM_SIZE:
{
}
break;
case WM_CLOSE:
delete[] tile_array;
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
在过去的几天里,我在论坛上搜索了各种堆腐蚀主题,到目前为止,我尝试了各种各样的东西
一个人建议,当程序点击delete[]
时,指向我的数组tile\u数组的指针可能已经改变了。但是我已经检查了几次,指针和数组的第一个元素的地址都保持不变
来自其他人帖子的其他论坛回答通常表明,我可能会多次删除该数组,但到目前为止,这是唯一一次将
delete[]
操作符用于该特定数组。如果不知道标题数组的每个访问权限,很难推测该问题的原因。程序出现的内存损坏并不总是导致它的原因
您可能需要检查的一件事是extern声明是针对“tile*tile\u数组”而不是“tile-tile\u数组[]”。我非常怀疑这是真的,但在处理外部和数组时,我看到这个错误会伤害一些人
我要做的另一件事是确保在删除tile_数组之后以及声明它时将其清空。如果在执行此操作时问题消失了,那么实际上可能是删除太早(在初始化之前)或删除太多
您最不希望再次检查的是没有缓冲区过度/不足运行。新的[]运算符将一些元数据放在堆上,delete[]运算符使用这些元数据来了解数组的大小,以便正确清理内存。损坏此元数据可能导致堆损坏 如果不知道title_数组的每个访问权限,就很难推测此问题的原因。程序出现的内存损坏并不总是导致它的原因 您可能需要检查的一件事是extern声明是针对“tile*tile\u数组”而不是“tile-tile\u数组[]”。我非常怀疑这是真的,但在处理外部和数组时,我看到这个错误会伤害一些人 我要做的另一件事是确保在删除tile_数组之后以及声明它时将其清空。如果在执行此操作时问题消失了,那么实际上可能是删除太早(在初始化之前)或删除太多
您最不希望再次检查的是没有缓冲区过度/不足运行。新的[]运算符将一些元数据放在堆上,delete[]运算符使用这些元数据来了解数组的大小,以便正确清理内存。损坏此元数据可能导致堆损坏 没有看到tile_数组最初是如何设置的,但由于它是外部的和全局的,是否有可能被其他人删除?在您的分配上设置一个bp,使用vs调试器在您写入数据后建立一个写入中断,并查看是否有其他人正在执行此操作。机会是,他们是(或者你是)。欢迎来到StackOverflow。请尝试并花时间正确格式化您的代码;它使你的问题更具可读性,并提高你快速得到答案的机会。请用空格替换制表符。您可以通过将代码粘贴到文本区域,选择所有代码,然后使用
Ctrl+K
或带有{}
字符的工具栏按钮来格式化代码。(您也可以通过将每行缩进四个或更多字符来设置格式。)您可以在输入文本区域正下方以几乎WYSYWIG的格式进行格式设置时预览。谢谢。:-)没有看到tile_数组最初是如何设置的,但由于它是外部的和全局的,是否有可能被其他人删除?在您的分配上设置一个bp,使用vs调试器在您写入数据后建立一个写入中断,并查看是否有其他人正在执行此操作。机会是,他们是(或者你是)。欢迎来到StackOverflow。请尝试并花时间正确格式化您的代码;它使你的问题更具可读性,并提高你快速得到答案的机会。请用空格替换制表符。您可以通过将代码粘贴到文本区域,选择所有代码,然后使用Ctrl+K
或带有{}
字符的工具栏按钮来格式化代码。(您也可以通过将每行缩进四个或更多字符来设置格式。)您可以在输入文本区域正下方以几乎WYSYWIG的格式进行格式设置时预览。谢谢。:-)很抱歉,我花了很长时间才回到这个话题。但问题最终确实是缓冲区溢出。我必须学习如何从globalflags程序设置pageheap.exe,然后使用WinDbg查找它,但我确实找到了导致堆损坏的地方并修复了它。感谢您的帮助,everone。Microsoft的应用程序验证程序是另一个可以很好地用于查找此类问题的工具。很抱歉我花了很长时间才回到这个话题上。但问题最终确实是缓冲区溢出。我必须学习如何从globalflags程序设置pageheap.exe,然后使用WinDbg查找它,但我确实找到了导致堆损坏的地方并修复了它。感谢您的帮助,everone。Microsoft的应用程序验证程序是另一个可以很好地用于查找此类问题的工具。这很有帮助