c++ - 访问冲突写入位置 0xcccccccc

标签 c++ access-violation

在过去的 2 天里,我一直被一个我似乎无法摆脱的违规行为所困扰。 我已经使用了断点并找到了错误所在,但我只是希望你们中的一个人能知道问题出在哪里,而无需我复制+粘贴我的所有代码-.-

我得到了

First-chance exception at 0x1027cb1a (msvcr100d.dll) in Escape.exe: 0xC0000005: Access violation writing location 0xcccccccc. Unhandled exception at 0x1027cb1a (msvcr100d.dll) in Escape.exe: 0xC0000005: Access violation writing location 0xcccccccc.

现在,快速的谷歌搜索让我觉得发生了一些奇怪的事情。所有的搜索结果都谈论指针实际上并不指向任何地方(0xccccccccc 是一个低内存地址?)。

我还没有在我的代码中使用指针,但无论哪种方式,我都会粘贴该函数并指出抛出异常的行(粗体):

void mMap::fillMap(){
    for(int i = 0; i <= 9; i++){
        for(int z = 0; z <= 19; z++){
            Tile t1;    // default Tile Type = "NULLTILE"
            myMap[i][z] = t1;
        }
    }
}

现在 myMap 是一个 Tile 类型的二维数组。几天前我有这个工作,直到我添加了一些其他类并且它都停止工作了!

最佳答案

要么是未初始化的指针,要么是存储在已释放的内存中的指针。我认为 cccccccc 是第一个,cdcdcdcd 是第二个,但它因编译器/库实现而异。

对于您的特定代码,可能 myMap 尚未分配,然后 myMap[0][0] 将导致对 0xcccccccc 的访问尝试


也可能发生 myMap 是您的类的开头,并且类指针未初始化:

class mMap
{
     Tile myMap[10][20];
public:
     void f() { myMap[0][0] = 0; }
};

mMap* what;
what->f(); // what is an invalid pointer

发生这种情况是因为成员函数不是虚函数,因此编译器知道要运行什么代码并将对象指针作为隐藏参数传递。最终编译器发出如下计算:

this + offsetof(Whatever::myMap) + z * sizeof(myMap[0]) + i * sizeof(myMap[0][0])

this,未初始化,是 0xcccccccc。显然 offsetof 部分为零,并且 iz 在第一次循环时都为零,所以你得到 0xcccccccc + 0 + 0 + 0 作为内存地址。


要对此进行调试,请使用调用堆栈并找到调用 fillMap 的函数。然后检查用于成员访问的指针 (->) 来自的函数。

关于c++ - 访问冲突写入位置 0xcccccccc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6085827/

相关文章:

c++ - Win32 控制台代码在哪里运行?从多个线程使用时控制台挂起

c++ - 在 C++ 中导入/包含所有库的快捷方式

c - 为什么分配内存后直接释放会出现访问冲突异常

c++ - 访问冲突新的 C++ 结构

c# - 无法捕获的 AccessViolationException

c++ - 在 unique_ptr 中显式调用对象的复制构造函数

c++ - Linux,C++,xft : how to use it?

java - C++ 映射冲突解决作为 java HashMap

c++ - 字符串太长时出现 AccessViolationException (C++)

c++ - dll 在 VS2010 项目中运行良好,但在 VS6 应用程序中出现访问冲突