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

Posted

技术标签:

【中文标题】vector.push_back() 方法调用在 C++ 中不起作用【英文标题】:vector.push_back() method call is not working in c++ 【发布时间】:2018-04-09 18:11:48 【问题描述】:

我是 C++ 新手,我正在尝试读取写入文件中的每一行的前四个单词,并为其分配一个我的类的对象,即 Detected_Object。我想将这些对象存储到向量中。当我尝试将我的类的 push_back 对象放入分段错误(核心转储)错误时。

其他矢量方法,如 size、max_size() 和 capacity() 在矢量上运行良好,但在 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);
    


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

谢谢。

【问题讨论】:

错误是什么?顺便说一句,即使您没有收到错误,您推入向量的指针在您将其推入向量后仅一行就无效。为什么你认为你需要一个指针向量而不是一个普通的向量? 摆脱这个错误的方法是使用调试器;) 我无法告诉您这是否是问题所在,但您正在将指向本地对象的指针存储在向量中。这些对象超出范围并让您的向量充满悬空指针。如果你真的必须在向量中有一个指针,那么你需要类似vector&lt;std::unique_ptr&lt;Detected_Object&gt;&gt; objects; 你可以试试这个:vector&lt;Detected_Object*&gt; objects = vector&lt;Detected_Object*&gt;(); ,你只声明了向量但你没有初始化它。 @DariusDuesentrieb 这不会改变任何事情。 vector&lt;Detected_Object*&gt; objects;vector&lt;Detected_Object*&gt; objects = vector&lt;Detected_Object*&gt;(); 相同 【参考方案1】:

使用std::vector&lt;Detected_Object&gt; 代替std::vector&lt;Detected_Object*&gt;,并将objects.push_back(&amp;obj) 更改为objects.push_back(obj)

正如目前所写的,对push_back 的调用存储了一个指向本地对象的指针,当该对象消失时,该指针指向不合理的地方。

通过存储对象而不是指针,您可以确保在创建对象的代码完成时对象仍然存在。

【讨论】:

感谢您的及时回答,在尝试使用指针之前我正在做同样的事情,即我创建了对象向量而不是指针向量。但这也给出了同样的错误。 @S.Vishwakarma -- 我无法推测我未见过的代码可能存在什么问题;我只能评论你展示的代码,它有一个我建议修复的主要问题。如果您进行了更改但仍有问题,请发布新代码(可能在新问题中)。【参考方案2】:

正如前面的答案所提到的,推回对象而不是指向对象的指针。此外,要调试分段错误,您始终可以使用 gdb 之类的调试工具。这是一个关于如何使用 gdb 调试分段错误的很好的教程:http://www.unknownroad.com/rtfm/gdbtut/gdbsegfault.html

【讨论】:

以上是关于vector.push_back() 方法调用在 C++ 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

没有匹配函数调用‘std::vector::push_back(std::string&)’

想简化我的 std::vector push_back 使用

正确使用用户定义类型的 std::vector.push_back()

在展开期间将向量成员推入向量:vector.push_back(vector[0])

vector::push_back 和 string::push_back 之间的区别?

Vector::push_back() 给出读取访问冲突