由于指针使用不当而导致的未上线异常
Unhlandled exception due to bad pointer usage
这是我在这里的第一个问题,所以我为你可能在我的帖子中发现的最终正式错误道歉。
我正在为"无向连接加权图"编写一个简单的类,该类必须使用基于向量的邻接列表。
问题是,当我从 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;
}
我注意到代码中有几个错误:
-
如果您需要的是邻接列表,那么
this->adj
应该是向量的向量。目前,它只是一个<int,int>
对的 1-D 向量。相反,它应该是:std::vector<std::vector<std::shared_ptr<std::pair<int,int>>>>* adj;
-
在构造函数中,this->adj 应按如下方式初始化:
this->adj = new std::vector<std::vector<std::shared_ptr<std::pair<int,int>>>>(V);
-
现在,在addEdge函数中,您需要首先访问与节点"v"对应的向量,然后,您需要将该对(w,权重)推入该向量[请注意,即使我们忽略只有向量的错误,逻辑仍然不正确,因为您将(v,weight)而不是(w,weight)推送到该向量中]。修改后的addEdge函数将是这样的:
void addEdge(int v, int w, int weight) { auto adjacencyList = adj->at(v); auto sp = std::make_shared<std::pair<int,int>>(std::make_pair(w,weight)); adjacencyList.push_back(sp); }
希望这对你有帮助
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- 由于指针使用不当而导致的未上线异常