我是c ++的新手,我正在尝试阅读文件中写入的每一行的前四个单词,并为其分配一个类的对象,即Detected_Object。我想将这些对象存储到矢量中。当我尝试将我的类的push_back对象转换为分段错误(Core Dumped)错误时。
像vector,max_size()和capacity()这样的vector的其他方法在vector上运行正常,但是在push_back()上它给出了错误。
我尝试过以后找到的解决方法: 1.尝试使用指向对象的向量而不是对象本身。 2.试图用new关键字初始化vector然后使用它。 3.调整大小的向量以容纳10个元素。 但是没有上述工作,我没有得到任何我做错的线索。代码库如下:
vector<Detected_Object*> objects;
ifstream fp;
string filename="../data/area_info/"+to_string(i)+".jpg.info";
fp.open(filename);
int left,right,top,bottom;
string line;
//end tracking if list of detected object is null
if(fp && fp.peek() == EOF){
return;
}else{
//read all detected objects from single frame
while (getline(fp, line)) {
int counter=0;
istringstream buf(line);
istream_iterator<std::string> beg(buf), end;
std::vector<std::string> tokens(beg, end); // done!
for(string& s: tokens){
std::cout << '"' << s << '"' << '\n';
if(counter==0){
left=stoi(s);
}else if(counter == 1){
right =stoi(s);
}else if(counter == 2){
top = stoi(s);
}else if(counter == 3){
bottom = stoi(s);
counter=0;
cout<<"value of left coordinate: "<<left<<" right: "<<right<<" top: "
<<top<<" bottom: "<<bottom<<endl;
break;
}
counter++;
}
Detected_Object obj(left,right,top,bottom);
cout<<"max sizeof vector of detected objects ";
cout<<objects.max_size();
//cout<<"detected object left: "<<obj.left<<"right: "<<right<<"top: "<<obj.top<<"bottom: "<<obj.bottom;
objects.push_back(&obj);
}
}
编辑:
以下代码也不起作用:
vector<Detected_Object> objects = vector<Detected_Object>();
Detected_Object obj;
ifstream fp;
string filename="../data/area_info/"+to_string(i)+".jpg.info";
fp.open(filename);
int left,right,top,bottom;
string line;
//end tracking if list of detected object is null
if(fp && fp.peek() == EOF){
return;
}else{
//read all detected objects from single frame
while (getline(fp, line)) {
int counter=0;
istringstream buf(line);
istream_iterator<std::string> beg(buf), end;
std::vector<std::string> tokens(beg, end); // done!
for(string& s: tokens){
std::cout << '"' << s << '"' << '\n';
if(counter==0){
left=stoi(s);
}else if(counter == 1){
right =stoi(s);
}else if(counter == 2){
top = stoi(s);
}else if(counter == 3){
bottom = stoi(s);
counter=0;
cout<<"value of left coordinate: "<<left<<" right: "<<right<<" top: "
<<top<<" bottom: "<<bottom<<endl;
break;
}
counter++;
}
obj = Detected_Object(left,right,top,bottom);
objects.push_back(obj);
}
}
请帮我找出解决此错误的方法。
感谢。
答案 0 :(得分:1)
使用std::vector<Detected_Object>
代替std::vector<Detected_Object*>
,并将objects.push_back(&obj)
更改为objects.push_back(obj)
。
正如当前所写的那样,对push_back
的调用存储了一个指向本地对象的指针,当该对象消失时,指针指向的位置无关紧要。
通过存储对象而不是指针,确保在创建对象的代码完成时对象仍然存在。
答案 1 :(得分:0)
如前所述,回推对象而不是指向对象的指针。此外,要调试分段错误,您始终可以使用调试工具,如gdb。这是一个很好的教程,介绍如何使用gdb调试分段错误:http://www.unknownroad.com/rtfm/gdbtut/gdbsegfault.html