我是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;
}
最佳答案
您的代码假定DB[id]
有任何学期,则有semester
学期:
if (DB[id].empty()) {
// ...
}
else
DB[id][semester]->push_back(b);
如果那不是真的,如果它有一个学期但没有这个学期,那么您就不会抓住它,而您正在使用
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);
}
那不是更好吗?
关于c++ - C++ vector :未使用的容量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52633050/