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