【问题标题】:read access violation error读取访问冲突错误
【发布时间】:2010-03-14 21:03:17
【问题描述】:
class Node{
      private:
              string name;
              Node** adjacent;
              int adjNum;
      public:
             Node();
             Node(string, int adj_num);
             Node(const Node &);
             bool addAdjacent(const Node &);
             Node** getAdjacents();
             string getName();
             ~Node();
      };

bool Node::addAdjacent(const Node &anode){
     Node** temp;   
     temp= new Node*[adjNum+1];
     for(int i=0;i<adjNum+1;i++)
         temp[i]=adjacent[i];
     temp[adjNum]=const_cast<Node *>(&anode);
     delete[] adjacent;
     adjacent=new Node*[adjNum+1];
     adjacent=temp;
     delete[] temp;
     adjNum++;
     return true;
}

int main()
{
    Node node1("A",0);
    Node node2("B",0);
    node1.getName();
    node1.addAdjacent(node2);
    system("PAUSE");
    return 0;
}

程序到这部分的时候:

for(int i=0;i<adjNum+1;i++)
     temp[i]=adjacent[i];

它说访问冲突读取位置 0xcccccccc。该类必须为相邻分配内存,但我认为它没有我该如何解决这个问题?

【问题讨论】:

  • 问题是?....
  • 我假设你没有分配adjacent?
  • 尝试通过 valgrind 或调试器运行程序。

标签: c++ visual-c++ oop


【解决方案1】:
 adjacent=new Node*[adjNum+1];
 adjacent=temp;
 delete[] temp;

这看起来像一个错误。你可能打算写:

adjacent = temp;

就是这样。

另外,我认为问题出在

for(int i=0;i<adjNum+1;i++)

您正在复制 adjNum+1 元素,即使(我假设)adjacent 仅包含 adjNum 元素。从for 循环中删除+1

【讨论】:

  • 确实我编辑了那部分,但正如我在问题中提到的那样,也存在内存分配问题。在创建 node1 对象时,我认为它必须创建相邻的指针并为其分配内存,但事实并非如此。同样的错误继续存在。
【解决方案2】:

除了提到的问题外,您可能缺少adjacent 的初始化,例如像这样:

Node::Node(std::string name, unsigned adj_num) 
  : name(name)
  , adjacent((adj_num > 0) ? new Node*[adj_num] : 0)
  , adjNum(adj_num)
{}

注意unsigned 参数,否定的adj_num 在这种情况下很可能毫无意义。

如果您不初始化 adjacent,它会包含一些垃圾值,并且取消引用它或将其传递给 delete[] 会导致未定义的行为。

【讨论】:

    猜你喜欢
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多