[英]C++ vector: unused capacity
我是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);
如果那不是真的,如果它有一個學期但沒有這個學期,則說明您沒有抓住,而是在默認構造的null指針上push_back
ing。 這意味着您的程序具有不確定的行為,而今天正是崩潰的原因。
相反,您可以嘗試:
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);
}
那不是更好嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.