C ++向量:未使用的容量

时间:2018-10-03 17:57:14

标签: c++ visual-c++

我是C ++的新手,我目前正在从事此类课程表项目,以下是我的add_course函数。我在地图上存储学生的ID,学期和课程列表。它可以工作(我可以向学生添加课程,并在打印学生的日程安排时看到它),但是每次运行代码时,总是会弹出一个异常:

Exception thrown: read access violation.
std::_Vector_alloc<std::_Vec_base_types<course *,std::allocator<course *> > >::_Myend(...) returned 0xC.

我很困惑,为什么会这样。这是否意味着我的载体容量超出了需要?

void add_course(map<int, map<int, vector<course *> * > > &DB, int semester, int id, course c) {
    const string a = c.name;
    course* b = new course(a, c.section, c.credits);
    if (DB[id].empty()) {
        vector<course*> *p2 = new vector<course*>;
        (*p2) = { b };
        DB[id][semester] = p2; 
        return;
    }
    else
        DB[id][semester]->push_back(b);
    return;
}

1 个答案:

答案 0 :(得分:3)

您的代码假定如果DB[id]任何个学期,则其学期为semester

if (DB[id].empty()) {
   // ...
}
else
    DB[id][semester]->push_back(b);

如果这不是真的,如果它有一个 some 个学期,但没有这个学期,则说明您没有抓住它,而是push_back使用默认构造的null指针。这意味着您的程序具有不确定的行为,而今天正是崩溃的原因。

您可以尝试:

if (!DB[id].count(semester)) {
   // ...
}
else
    DB[id][semester]->push_back(b);

…实际上会检查特定内部map元素的存在。

但是,如果没有所有这些动态分配,您的状况就会更好:

void add_course(
   map<int, map<int, vector<course>>>& DB,
   const int semester,
   const int id,
   const course c
)
{
    DB[id][semester].emplace_back(c.name, c.section, c.credits);
}

不是更好吗?!