C++ vector : unused capacity

标签 c++ visual-c++

我是 C++ 的新手,我目前正在处理这个类(class)表项目,以下是我的 add_course 函数。我在 map 中存储学生的 ID、学期和类(class)列表。它有效(我可以向学生添加类(class)并在打印学生的时间表时看到它)但是每次运行代码时,总是会弹出一个异常:

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]any 个学期,它有学期 semester:

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

如果那不是真的,如果它有 一些 个学期但不是这个学期,那么您就没有捕获它,并且您正在 push_back 默认 -构造空指针。这意味着您的程序有未定义的行为,今天是崩溃的原因。

相反,您可以尝试:

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++ vector : unused capacity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52633050/

相关文章:

c++ - 具有现有变量的基于范围的 for 循环

c++ - 将非托管 C++ 对象传递到托管 C++ 代码

c++ - QObject::connect: 无法连接 (null)::mySignal() 到 (null)::mySlot()

c++ - 像 JAXB 一样在 QT 中生成 XML

c++ - 为什么 C++ 中的 setiosflags 出现没有设置指定的标志?

c++ - 有没有人在 Visual Studio 2010 中使用 C++ 中的 JSON?

c++ - delete[] 和内存泄漏

c++ - 在同一个 io_service 对象上 boost 异步套接字和线程池

c++ - 无法在动态链接库中找到入口点 - C++

c++ - 在现有的visual studio 2017中下载c++