【发布时间】:2015-07-09 12:54:14
【问题描述】:
这是我在这里的第一个问题,因此对于您在我的帖子中可能发现的最终正式错误,我深表歉意。
我正在为“无向连接加权图”编写一个简单的类,它必须使用基于向量的邻接表。
问题是,当我从 Eclipse 运行程序时,MS Windows 说它“停止工作”,调试后我收到“0x00AE251A 处的未处理异常 .... 访问冲突写入位置 ...”消息。 环顾四周,我发现这个问题可能是由于缺少指针破坏或指针初始化(?)引起的。我从标准指针切换到 shared_ptr 来解决这个问题,但错误是一样的......
有人可以告诉我吗?我几乎浪费了一整天的时间试图找到原因,但没有成功。
class UndirectedGraph
{
private:
int V;
std::vector<std::shared_ptr<std::pair<int,int>>>* adj;
public:
UndirectedGraph(int V)
{
this->V = V;
this->adj = new std::vector<std::shared_ptr<std::pair<int,int>>>;
}
void addEdge(int v, int w, int weight)
{
auto sp = std::make_shared<std::pair<int,int>>(std::make_pair(v,weight));
adj[v].push_back(sp);
}
int main()
{
UndirectedGraph G1(7);//Ok
G1.addEdge(0,1,9);//Ok
G1.addEdge(1,2,5);//Ok
G1.addEdge(2,0,8);//EXCEPTION RAISED HERE (if line is commented all run fine)
return 0;
}
【问题讨论】:
-
您没有在构造函数中使用 V 参数,因此当您尝试
adj[v].push_back(sp);时,您的向量 this->adj 为空 -
即使我在“adj”初始化的末尾添加 (V) 作为大小,问题仍然存在。另外,我认为即使向量为空,push_back 也应该可以工作,对吧?
标签: c++ graph memory-leaks shared-ptr digraphs