Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除全局数组时堆损坏_C++_Arrays_Winapi_Delete Operator_Heap Corruption - Fatal编程技术网

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的应用程序验证程序是另一个可以很好地用于查找此类问题的工具。这很有帮助