vector.push_back()方法调用在c ++中不起作用

时间:2018-04-09 18:11:49

标签: c++ vector segmentation-fault coredump

我是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);
    }

}

请帮我找出解决此错误的方法。

感谢。

2 个答案:

答案 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