推送到指针向量 C++ 的向量时,进程已完成并带有退出代码

问题描述 投票:0回答:2

我正在执行此函数以将一对新对象推送到向量的特定位置。但一旦程序尝试执行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);

可能会出现什么问题

c++ clion
2个回答
0
投票
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)。


0
投票

该退出代码可能是由于内存泄漏造成的。我立即看到的一个问题是您正在使用 new 关键字,无需动态分配内存,因为向量类将处理内部所需的所有内存管理。我的猜测是您没有在程序中使用删除关键字取消分配内存。一般来说,在 C++ 中,除非绝对必要,否则最好避免使用 new 关键字。

© www.soinside.com 2019 - 2024. All rights reserved.