libc++abi:以std::length_error:vector zsh:abort类型的未捕获异常终止



我主要为CovidCaseMap类中的函数"getCasesOverTime"编写代码,该函数返回这些TimeAndCaseData对象的向量。TimeAndCaseData类用于记录某个时间点的活动案例数。getCasesOverTime函数提供一个int参数,表示我们假设一个案例处于活动状态的小时数。

这是代码

`

#ifndef COVIDCASEMAP_H
#define COVIDCASEMAP_H
#include "CovidCase.h"
#include <vector>
using std::vector;
#include <string>
using std::string;

//Record the number of active cases from some point in time
class TimeAndCaseData
{
private:
int time;
int currentCases;

public:
//constructor
TimeAndCaseData(const int timeIn, const int currentCasesIn)
{
time = timeIn;
currentCases = currentCasesIn;
}

int & getTime()
{
return time;
}
int & getNumberOfCases()
{
return currentCases;
}
};
class CovidCaseMap
{
private:
vector<CovidCase> covidCases;
public:
void addCase(const CovidCase & c)
{
covidCases.push_back(c);
}
vector<TimeAndCaseData> & getCasesOverTime(int activeHours)
{
vector<TimeAndCaseData> data;
vector<int> caseTime;
for(int i = 0; i < covidCases.size(); i++)
{
caseTime.push_back(covidCases[i].getTime());
}
sort(caseTime.begin(), caseTime.end());
data.push_back(TimeAndCaseData(0,0));

for(int j = 1; j < caseTime.size()*2+1; j++)
{
if(j==1) data.push_back(TimeAndCaseData(caseTime[0], 1));
if(caseTime[j-1]+activeHours < caseTime[j])
{
data.push_back(TimeAndCaseData(caseTime[j-1]+activeHours, data[j-  1].getNumberOfCases()-1));
}

else if (caseTime[j] < caseTime[j-1]+activeHours)
{
data.push_back(TimeAndCaseData(caseTime[j], data[j-1].getNumberOfCases()+1));
}
//when they are the same
else
{
data.push_back(TimeAndCaseData(caseTime[j], data[j-1].getNumberOfCases()));
}
}
return data;
}
};

`

这是测试代码

`

#include "CovidCaseMap.h"
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <utility>
using std::string;
using std::cout;
using std::endl;
using std::ostringstream;
using std::pair;
using std::vector;
int main() {

int retval = 0;


CovidCaseMap m;
m.addCase(CovidCase(51.75186263338416,-0.3356807902,"48763f26d6b",21,5));
m.addCase(CovidCase(51.75166927531987,-0.3455440017,"48763f3b5ef",24,8));
m.addCase(CovidCase(51.75293227875113,-0.3363451467,"48763f26e9b",19,73));
m.addCase(CovidCase(51.751442536246415,-0.3384676374,"48763f23ff9",35,117));
m.addCase(CovidCase(51.750621522352574,-0.3373409116,"48763f21445",42,142));

vector<pair<int,int> > rightAnswer;
rightAnswer.emplace_back(0,0);
rightAnswer.emplace_back(5,1);
rightAnswer.emplace_back(8,2);
rightAnswer.emplace_back(73,3);
rightAnswer.emplace_back(117,4);
rightAnswer.emplace_back(125,3);
rightAnswer.emplace_back(128,2);
rightAnswer.emplace_back(142,3);
rightAnswer.emplace_back(193,2);
rightAnswer.emplace_back(237,1);
rightAnswer.emplace_back(262,0);


vector<TimeAndCaseData> active = m.getCasesOverTime(120);

if (active.size() == 0) {
cout << "An empty vector was returned, the test cannot passn";
return 1;
}

for (int i = 0; i < rightAnswer.size(); ++i) {        

cout << "Entry " << i << ": expecting time = " << rightAnswer[i].first << ", cases = " << rightAnswer[i].second; 

if (i >= active.size()) {
cout << " -- not enough entries in the answer from the getCasesOverTime functionn";
++retval;
continue;            
}
if (rightAnswer[i].first == active[i].getTime() && rightAnswer[i].second == active[i].getNumberOfCases()) {
cout << " -- got itn";
} else {
cout << " -- instead got time = " << active[i].getTime() << ", cases = " << active[i].getNumberOfCases() << "n";
++retval;
}
}

return retval;
}

`

当我尝试编译时,没有问题,但当我尝试运行它时,我得到了一条错误消息作为标题。我该怎么解决这个问题?谢谢

我对C++很陌生,还找不到方法。

vector<TimeAndCaseData> & getCasesOverTime(int activeHours)返回对vector的引用,但vector在函数中是本地的,当函数结束时它会被销毁,您有一个悬空引用。修复方法是删除&,然后返回vector的副本。

另一个问题是for(int j = 1; j < caseTime.size()*2+1; j++)和所有caseTime[j]访问都超出了限制。卸下*2+1时崩溃消失。

https://godbolt.org/z/nT8MKzfao

几个编译器警告,您应该修复它们。

相关内容

最新更新