我遇到了一些与我在我的结构中使用一个可能需要使用大约6000个元素的向量这一事实有关的崩溃。这是我的结构:
struct Students
{
char* names;
std::vector<int> scores;
};
有没有办法让它成为我的向量不会导致我的结构导致错误。这是我的主叫代码。
while(scores.hasNext())
{
students[current_student].scores.push_back(grade);
}
我的问题:如果这是一个结构中向量大小分配的问题,我是否可以声明一个指向向量的指针并对我的向量进行deference而不是实际在结构中?
成绩只是一个整数。
答案 0 :(得分:2)
你让我想起以前遇到的类似问题。由于没有为您的其余代码提供足够的信息,我只是在这里猜测。
显然students
是一个结构Students
的数组。假设它已在堆上分配,如果您使用malloc
执行此操作,则无法正常工作,因为 malloc将无法正确初始化结构中的成员。特别是,这里scores
是一个非POD对象,它需要通过调用它的构造函数来正确构造。
// the member in your structure is not initialized
students = (struct Students*) malloc(10 * sizeof(Students));
// oops.. scores is not initialized
students[0].scores.push_back(100);
要解决此问题,您需要致电new
。它将通过调用构造函数来正确初始化成员。
// ok
students = new Students[10];
答案 1 :(得分:1)
如果您从此行中的vector
代码中收到错误
students[current_student].scores.push_back(grade);
这并不意味着问题出在矢量上。它的意思是你访问无效的内存(未初始化或未分配)。可能current_student
已超出students
范围,或者您通过致电students
而不是malloc
分配了new
。
如果不提供更多代码,就无法回答您的问题。
答案 2 :(得分:0)
首先,您不应该将struct
视为需要特殊预防措施的奇怪事情。 They are equivalent to class
然后,如评论中所述,您应该添加真实代码,因为如果您真的这样做:
while(scores.hasNext())
{
students[current_student].scores.push_back(grade);
}
然后你会继续向你的矢量添加元素(如果hasNext()
听起来有效),直到你得到std::bad_alloc()
最后,不要担心向量的大小:std::vector
基本上已经是指向堆中向量的指针。无论你的矢量变得多么“胖”,你的结构都将保持“小”。