【问题标题】:What does access violation mean?访问冲突是什么意思?
【发布时间】:2013-04-10 21:46:09
【问题描述】:

我是 C++ 新手,不明白为什么会收到错误“访问冲突读取位置”。这是我的代码:

gdiscreen();
int startX = 1823 - minusX;
int startY = 915 - minusY;
for (int i = startX; i < startX + 61; i++)
{
    for (int j = startY; j < startY + 70; j++)
    {
        Color pixelColor;
        bitmap->GetPixel(i, j, &pixelColor);
        cout << pixelColor.GetValue() << " ";
    }
    cout << endl;
}

gdiscreen() 可以在这里找到: http://forums.codeguru.com/showthread.php?476912-GDI-screenshot-save-to-JPG

【问题讨论】:

  • 它会打印任何东西吗?还是直接失败?位图从何而来?确定它的初始化正确吗?
  • 还有更多问题。 minusXminusY 是什么?您是否检查过您是否使用有效的ij 坐标进行访问?
  • “访问冲突”的确切含义并不那么重要;重要的是这意味着你的程序不正确,需要调试。
  • 这意味着你做错了记忆。 bitmap 很可能不是您认为的那样。做一些调试。创建testcase
  • 它不打印任何东西,并且我在 for 循环之外的测试用例失败了。我在链接中使用了相同的代码,但将位图设为全局指针变量(我习惯于 java/C#)。还有什么想法吗?

标签: c++ access-violation


【解决方案1】:

访问冲突分段错误表示您的程序试图访问未在范围内保留的内存。
举几个例子来实现这一点:

数组的下界:

int arr[10];
for(unsigned char i=0; i<=10; i++)  //Will throw this error at i=10
    arr[i]=0;

注意: 在上面的代码中,我使用unsigned char进行迭代。 Char 是一个字节,所以 unsigned char 是 0-255。对于更大的数字,您可能需要unsigned short(2 个字节)或unsigned int(4 个字节)。

不小心用指针而不是整数计算

int ah = 10;
int *pointer = &ah;   //For some reason, we need pointer
pointer++;   //We should've written this: (*pointer)++ to iterate value, not the pointer
std::cout<<"My number:"<<*pointer<<'\n';  //Error - accessing ints address+1

我故意从广泛的解释开始。您首先想知道什么是访问冲突。在您的特定代码中,我很确定您搞砸了 ij 边界。做一些std::cout 调试。

【讨论】:

  • 当数组在堆栈上时,超出数组的边界不会导致 AVs/SFs,当数组在堆上时也不能保证。您的 int 指针示例也是类似的,因为递增的指针正在访问堆栈空间,因此它也不会导致 AV/SF。选择一个更好的例子,比如取消引用 NULL 指针(或接近 NULL 的指针)
  • unsigned char 不应该是unsigned int
  • @0x499602D2:循环计数器可以使用任何数字数据类型。由于示例中的数组只有 10 个元素,因此循环仅使用可用的最小数据类型。
  • 这似乎与问题无关
  • 我不认为这是切线的,OP 正在询问导致错误的原因。它只是读取/写入无效的内存位置。错误可能不会立即出现,甚至可能需要一段时间才能在错误发生时变得明显。例如,像std::string foo(bool which) { if (which) return "Hi!"; } 这样的函数虽然严格有效,但会导致堆栈和/或堆损坏。当您拨打foo(false) 时,您将在拨打foo 附近的任何地方崩溃。
猜你喜欢
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 2010-10-13
  • 2017-12-04
  • 1970-01-01
  • 2018-02-05
相关资源
最近更新 更多