0xC0000005:访问冲突读取位置0x00000004

0xC0000005: Access violation reading location 0x00000004

本文关键字:位置 0x00000004 读取 访问冲突 0xC0000005      更新时间:2023-10-16

我的问题是我面临的错误"未处理的异常在0x00bd3364在qualnet.exe: 0xC0000005:访问违规读取位置0x00000004.".

这个场景是我定义了一个结构体(nodeinfotable),它在另一个结构体(Node)中使用。请注意,我在网络模拟器QualNet中使用此代码。每当我在网络模拟器中执行代码时,我都会出错。然而,如果我在一个单独的项目(测试项目)中执行我的代码,那么这个代码就会正确执行。

我认为内存分配有一些问题。但我想知道为什么它在一个项目中正确运行,而在另一个项目中却没有。

我也搜索了其他类似标题的帖子,但他们的问题不同。这就是为什么,我使用了新的帖子来查询。

我的代码如下:

文件:node.h

struct NodesInfoTable {
    int nodeId;
    int nodeStatus;
    list<int> channels;
};

struct Cluster {
    int clusterId;
    list<int> commonChannels;
    Cluster() {
        clusterId= -1;
    }
};

struct Node {
    int var1;
    int var2;
    Cluster* cluster;
    list<NodesInfoTable*> nodeTable;
};

文件:node.cpp

Node* newNode;
newNode = (Node*) MEM_malloc(sizeof(Node));
.....
newNode->cluster = new Cluster();
newNode->nbTable = ??
....

文件:myfile.cpp

NodesInfoTable nbTable1; 
nbTable1.nodeId = 1;
nbTable1.nodeStatus = 2;
node->nbTable.push_back(nbTable1); //'node' object is available here

我得到错误:

在qualnet.exe中0x00bd3364的未处理异常:0xC0000005:访问违反读取位置0x00000004.

:

节点-> nbTable.push_back (nbTable1);

调试器将我导航到文件列表中的代码_Nodeptr _Newnode = _Buynode(_Pnode, _Prevnode(_Pnode), _Val);。下面还提到了这段代码上面和下面的一些更多语句:

_Nodeptr _Pnode = _Where._Mynode();
_Nodeptr _Newnode = _Buynode(_Pnode, _Prevnode(_Pnode), _Val);
_Incsize(1);
_Prevnode(_Pnode) = _Newnode;
_Nextnode(_Prevnode(_Newnode)) = _Newnode;

请不要告诉我通过'node'对象正确访问'cluster'对象。然而,问题是'nbTable'。由于我使用了语句newNode->cluster = new Cluster(),我认为这就是为什么内存被分配给这个对象。但我不知道我应该如何处理newNode->nbTable = ??,因为我认为这是问题所在。

提前谢谢你,我期待着解决方案。

我还没有验证它,但是注释基本上说明了它。

结构如下:

struct Node {
    int var1;
    int var2;
    Cluster* cluster;
    list<NodesInfoTable*> nodeTable;
};

您分配的:

Node* newNode;
newNode = (Node*) MEM_malloc(sizeof(Node));

我不知道MEM_malloc到底做了什么,但是剧组辱骂了一些东西,可能是void*被分为Node*。如果你看一下Node结构,你有一个list<NodesInfoTable*>,它可能是std::list,它是一个

我们都知道,类需要在正确使用它们之前运行它们的构造函数。分配原始内存并强制转换它不会神奇地执行构造函数。

如果你在某处看到一个类,使用new!

作为一个基本规则,你应该在c++中使用newdelete