[英]vector of structs with weird behavior c++
我有一个分配的问题。 我必须读取一个.ts文件,读取其中的数据包,然后从每个数据包中提取标头信息。 我创建了一个结构数据包,它将保存标头的所有信息,并且我还有一个向量,其中我将push_back每个数据包。 问题是for循环由于某种原因在163rd循环上停止。 如果我循环直到让我说i = 160,则代码转义结束了循环,但是当我打印vector.size()时,我得到了一个非常大的数字,没有意义。 我猜它应该是一个高的整数值,它与Packets.backed的回退数一样高。这是我到目前为止的代码:
int main() {
FILE *ts_file = NULL;
ts_file = fopen64("/home/ddd/Desktop/Assignment/Streams/ddd.ts", "rb");
if (ts_file == NULL){
cout << "No file detected on this path, try again" << endl; // prints !!!Hello World!!!
}
TS_Analyzer *ts_analyzer;
ts_analyzer->parse_file(ts_file);
cout << "Finished main" << endl;
return 0;
}
TS_Analyzer :: parse_file(FILE * ts_file){
cout << "Inside parser" << endl;
fseek(ts_file,0,SEEK_END);
long file_size = ftell(ts_file);
rewind (ts_file);
number_of_packets = file_size/PACKET_SIZE;
unsigned int current_header_add = 0;
unsigned int i=0;
for (unsigned int j=1; i<number_of_packets; j++)
{
i++;
unsigned char TS_raw_header[4];
cout << "current position " << int(current_header_add) << endl;
current_header_add = ftell(ts_file);
fread(&TS_raw_header, sizeof(TS_raw_header), 1, ts_file);
Packet current_packet;
current_packet.sync_byte = TS_raw_header[0];
current_packet.transport_error_indicator = (TS_raw_header[1] & 0x80) >> 7;
current_packet.payload_start_indicator = (TS_raw_header[1] & 0x40) >> 6;
current_packet.transport_priority = (TS_raw_header[1] & 0x20) >> 5;
current_packet.PID = ((TS_raw_header[1] & 31) << 8) | TS_raw_header[2];
current_packet.transport_scrambling_control = (TS_raw_header[3] & 0xC0);
current_packet.adaption_field_control = (TS_raw_header[3] & 0x30) >> 4;
current_packet.continuity_counter = (TS_raw_header[3] & 0xF);
stream_packets.push_back(current_packet);
//cout << hex << int(current_packet.PID) << endl;
//cout << dec << "continuity counter " << int(current_packet.continuity_counter) << endl;
cout << " i " << int(i) << endl;
fseek(ts_file, 184, SEEK_CUR);
}
cout << "@@" << endl;
cout << stream_packets.size() << endl;
}
TS_Analyzer类:公共分析器{
公共:TS_Analyzer(); 〜TS_Analyzer();
struct Packet {
unsigned char sync_byte;
unsigned char transport_error_indicator;
unsigned char payload_start_indicator;
unsigned char transport_priority;
unsigned int PID;
unsigned char transport_scrambling_control;
unsigned char adaption_field_control;
unsigned char continuity_counter;
};
std::vector<Packet>stream_packets;
int number_of_packets = 0;
void parse_file(FILE *);
};
为什么矢量push_back会中断for循环以及为什么我无法获得正确的矢量大小?
如果我将此代码通过clang编译器放置,则会在以下代码中收到错误消息:
TS_Analyzer *ts_analyzer;
ts_analyzer->parse_file(ts_file);
>> variable 'ts_analyzer' is uninitialized when used here
我猜您正在遇到未定义的行为:由于ts_analyzer和ptr是任意随机值,因此其成员中的数据也非常随机。
尽管您总是很幸运,但实际上我很惊讶该代码可以完全运行而不会崩溃。
如果您想解决此问题,请尝试通过在堆栈上创建对象来避免使用指针:
TS_Analyzer ts_analyzer;
ts_analyzer.parse_file(ts_file);
或者,如果您确实需要分配内存,请至少填写指针:
auto ts_analyzer = std::make_unique<TS_Analyzer>();
ts_analyzer->parse_file(ts_file);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.