Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++编写的程序中有一个异常,在Windows下运行。_C++_Exception - Fatal编程技术网

如何解决访问冲突? 目前,C++编写的程序中有一个异常,在Windows下运行。

如何解决访问冲突? 目前,C++编写的程序中有一个异常,在Windows下运行。,c++,exception,C++,Exception,以下是日志中的最小转储信息 08/12/15 04:37:19 I New Information for UID 2d936a, FloorLoc F1505 08/12/15 04:37:19 E >>>>> EXCEPTION: Access Violation while trying to read address 20203567 [Fault address: 004AF945 01:000AE945 C:\Program Files (x86)

以下是日志中的最小转储信息

08/12/15 04:37:19 I New Information for UID 2d936a, FloorLoc F1505
08/12/15 04:37:19 E >>>>> EXCEPTION: Access Violation while trying to read address 20203567 
[Fault address:  004AF945 01:000AE945  C:\Program Files (x86)\MySystems\WPR.exe 00400000] <<<<<
Call stack:
Load addr  Address   Frame     Logical addr  Module
00400000   004AF945  0588F8CC  0001:000AE945 C:\Program Files (x86)\MySystems\WPR.exe  
00400000   004A89A4  0588FAEC  0001:000A79A4 C:\Program Files (x86)\MySystems\WPR.exe
似乎
m_elem
new
操作符获取一个地址,并且
SetLocation
函数调用也不例外。此外,还应确保以下日志输出正确

为什么从
SetValue0
抛出一个异常?
这里是函数
SetValue0

void SetValue0(INDEX idx, DWORD val)    
{ 
    if (idx >= 0 && idx < MAX_INDEX){
        if(val != m_Info[idx]) 
        { 
            m_Info[idx] = val;  
        } 
    }
}

这类问题有点难回答。我在评论中提出了一些想法,我将在这里详细阐述。以下是我在没有其他线索的情况下,在这些崩溃日志中寻找的东西

在该位置读取时的访问冲突表明以下情况之一:

  • TempMSE
    不是有效的指针,尝试从中获取
    m_elem
    时引发异常

  • TempMSE->m_elem
    无效,当尝试测试
    m_Info[idx]
    的值时,会在
    SetValue0
    内部引发异常

在后一种情况下,如果在某个位置删除
TempMSE->m_elem
,但不将其设置为NULL,则可能会发生这种情况。如果另一个线程负责该删除,那么这里可能有一个争用条件,它将被设置为NULL,但首先执行该代码

另一种可能是
TempMSE
TempMSE->m_elem
在过程中的某个地方被损坏。这可能是由于
TempMSE
内部的缓冲区溢出(如果您有数组),或者基本上是内存中这些指针附近发生的任何类型的未定义行为造成的。如果堆栈上有
TempMSE
,则查找是否存在任何潜在故障

我不想用其他类型的推测(比如堆损坏)来填充这个答案,但希望它能为您提供一些尝试的途径。常见罪犯的基本名单如下:

  • 编码错误(未初始化或重置值)
  • 线程问题、争用条件
  • 未定义的行为或溢出破坏数据

祝你好运

我说不出什么是真正的错误,但我会在
0x004AF945
处反汇编代码以及之前的几个指令,并尝试了解失败函数的哪一部分

正如其中一条评论中指出的,发生故障的地址看起来可疑地像
'C#'
,这让我觉得某个地方有一个字符串溢出了


这只是一个猜测,但我怀疑
TempMSE->m_elem
是包含值
0x20203567
的内容,因此当它尝试访问它时,它不是
NULL
,这意味着不执行日志记录。[显然,这是基于您迄今为止显示的代码,如果之前/之后有日志显示情况并非如此,我的第二个猜测是,
m_info
在某种程度上是错误的…

如果
TempMSE
TempMSE->m_elem
不是有效地址,或指针悬空。例如,未初始化或已删除,并且未设置为NULL,或者如果对象内的某个位置的缓冲区溢出中出现了
m_elem
。“20203567”看起来像ASCII字符。是否检查
m_elem
指针是否指向(可写)RAM而不是一些只读常量数据?@harper,你的意思是通过
new Element
检查指针返回?你没有调试器吗?@paddy,即使m_elem`是悬空指针,它也只从
new
操作符获得一个新地址,这让我很困惑。(小端)
20203567
“c5”
,而不是
“c#”
void SetValue0(INDEX idx, DWORD val)    
{ 
    if (idx >= 0 && idx < MAX_INDEX){
        if(val != m_Info[idx]) 
        { 
            m_Info[idx] = val;  
        } 
    }
}
class Element {
    // other function here...

private:
    FloorLocation   m_FloorLoc;
    DWORD   m_Info[MAX_INDEX];
    bool            m_Dirty;
};

Element::Element(const Element& elem) {
    m_FloorLoc = elem.m_FloorLoc;
    for (int i = 0; i < MAX_INDEX; ++i)
       m_Info[i] = elem.m_Info[i];
    m_Dirty = elem.m_Dirty;
}

class FloorLocation {
    // other function here...
private:
    FloorId m_floorloc;
};

FloorLocation::FloorLocation( const FloorLocation& loc )
{
    memset(&m_floorloc, ' ', 8); // space filled

    if(loc.m_floorloc.id[0] != 0)
    {
        memcpy(m_floorloc.id, loc.m_floorloc.id, 8);

        // eliminate nulls
        for(int ndx=0; ndx < 8; ndx++)
        {
            if(m_floorloc.id[ndx] == 0)
                m_floorloc.id[ndx]=' ';
        }
    }
}

typedef struct {
    char id[8];
} FloorId;