我正在执行此函数以将一对新对象推送到向量的特定位置。但一旦程序尝试执行push_back(emplace_back)函数。程序卡住了,我得到它返回,没有任何明显的错误:
Process finished with exit code -1073741819 (0xC0000005)
vector <vector<pair<int, double>>*> ug;
vector <vector<pair<int, double>>> foundPaths;
void graph::addUndirectedRoute(const city& city1, const city& city2, double distance) {
static int maxId = max(city1.id, city2.id);
if (maxId >= ug.size()) {
while(maxId > ug.size()) {
ug.push_back(nullptr);
}
}
if(ug[city1.id] == nullptr)
ug[city1.id] = new vector<pair<int, double>>();
if(ug[city2.id] == nullptr)
ug[city2.id] = new vector<pair<int, double>>();
ug[city1.id]->emplace_back(city2.id, distance); // execution gets stuck here
ug[city2.id]->emplace_back(city1.id, distance);
可能会出现什么问题
vector <vector<pair<int, double>>*> ug;
vector <vector<pair<int, double>>> foundPaths;
void graph::addUndirectedRoute(const city& city1, const city& city2, double distance) {
static int maxId = max(city1.id, city2.id); // here, maxId is static, so it can only be executed once
if (maxId >= ug.size()) {
while(maxId > ug.size()) {
ug.push_back(nullptr);
}
}
if(ug[city1.id] == nullptr)
ug[city1.id] = new vector<pair<int, double>>();
if(ug[city2.id] == nullptr)
ug[city2.id] = new vector<pair<int, double>>();
ug[city1.id]->emplace_back(city2.id, distance); // execution gets stuck here
ug[city2.id]->emplace_back(city1.id, distance);
在您的代码中,
maxId
是一个静态变量,因此它只能在addUndirectedRoute
第一次执行时进行评估。
假设第一次调用时 city1.id, city2.id
的值为 (1, 2),因此 maxId
为 2,ug
将扩展到 2。
然后第二次调用 addUndirectedRoute
和 city1.id, city2.id
(5, 6),maxId
仍然是 2,但你认为 ug
大于或等于 max(city1.id, city2.id)。
该退出代码可能是由于内存泄漏造成的。我立即看到的一个问题是您正在使用 new 关键字,无需动态分配内存,因为向量类将处理内部所需的所有内存管理。我的猜测是您没有在程序中使用删除关键字取消分配内存。一般来说,在 C++ 中,除非绝对必要,否则最好避免使用 new 关键字。