Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vector.push_back()方法调用在c++; 我是C++的新手,我尝试读文件中每一行的前四个单词,并给它分配一个类,即DeCeTdEdTo对象。我想把这些对象存储到向量中。当我试图将类的对象推回分段时,错误(核心转储)出现了_C++_Vector_Segmentation Fault_Coredump - Fatal编程技术网

vector.push_back()方法调用在c++; 我是C++的新手,我尝试读文件中每一行的前四个单词,并给它分配一个类,即DeCeTdEdTo对象。我想把这些对象存储到向量中。当我试图将类的对象推回分段时,错误(核心转储)出现了

vector.push_back()方法调用在c++; 我是C++的新手,我尝试读文件中每一行的前四个单词,并给它分配一个类,即DeCeTdEdTo对象。我想把这些对象存储到向量中。当我试图将类的对象推回分段时,错误(核心转储)出现了,c++,vector,segmentation-fault,coredump,C++,Vector,Segmentation Fault,Coredump,其他向量方法,如size、max_size()和capacity()在向量上工作正常,但在push_back()上会产生错误 到目前为止,我已经尝试了以下解决方法: 1.尝试使用指向对象的指针向量代替对象本身。 2.尝试使用新关键字初始化向量,然后使用它。 3.调整向量大小以容纳10个元素。 但是以上这些都不起作用,我不知道我做错了什么。代码库如下所示: vector<Detected_Object*> objects; ifstream fp; string filename=".

其他向量方法,如size、max_size()和capacity()在向量上工作正常,但在push_back()上会产生错误

到目前为止,我已经尝试了以下解决方法: 1.尝试使用指向对象的指针向量代替对象本身。 2.尝试使用新关键字初始化向量,然后使用它。 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);
    }

}
矢量对象;
ifstream-fp;
string filename=“../data/area_info/”+to_string(i)+“.jpg.info”;
fp.open(文件名);
int左、右、上、下;
弦线;
//如果检测到的对象列表为空,则结束跟踪
if(fp&&fp.peek()==EOF){
回来
}否则{
//从单个帧读取所有检测到的对象
while(getline(fp,line)){
int计数器=0;
istringstream buf(线);
istream_迭代器beg(buf),结束;
向量标记(beg,end);//完成!
for(字符串和符号:标记){
std::cout使用
std::vector
代替
std::vector
,并更改
对象。向后推(&obj)
对象。向后推(obj)

正如当前编写的那样,对
push_back
的调用存储了一个指向本地对象的指针,当该对象消失时,指针指向任何地方


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

如前面的答案所述,将对象而不是指向对象的指针向后推。此外,要调试分段错误,您可以始终使用gdb之类的调试工具。这是一个很好的ho教程w使用gdb调试分段错误:

错误是什么?顺便说一句,即使你没有得到错误,你在向量中插入的指针在插入一行后就无效了。为什么你认为你需要一个指针向量而不是普通向量?消除这个错误的方法是使用调试器;)我不能告诉你是否没有这就是问题所在,但您正在向量中存储指向本地对象的指针。这些对象超出了范围,使向量中充满了悬空指针。如果您确实必须在向量中包含指针,则需要类似于
向量对象;
的内容,您可以尝试以下操作:
向量对象=向量();
,您只声明了向量,但没有对其进行初始化。@DariusDuesentrieb不会更改任何内容。
向量对象;
向量对象=向量()相同
谢谢你的及时回答,我在尝试使用指针之前也做了同样的事情,即我创建了对象的向量而不是指针的向量。但这也产生了同样的错误。@S.Vishwakarma--我无法推测我没有看到的代码可能有什么问题;我只能对您显示的代码进行注释,并且它有一个我建议解决的主要问题。如果您进行了更改但仍然存在问题,请发布新代码(可能在新问题中)。
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);
    }

}