簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM