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。该类必须分配相邻的内存,但我认为它不能如何解决这个问题?
答案 0 :(得分:3)
adjacent=new Node*[adjNum+1];
adjacent=temp;
delete[] temp;
这看起来像个错误。你可能想写:
adjacent = temp;
就是这样。
另外,我认为问题在于
for(int i=0;i<adjNum+1;i++)
您正在复制adjNum+1
元素,即使(我假设)adjacent
仅包含adjNum
个元素。从+1
循环中删除for
。
答案 1 :(得分:1)
除了提到的问题之外,您可能缺少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[]
会导致未定义的行为。