销毁libtrace_out_t*数组的问题
Problems with destroying an array of libtrace_out_t*
任务是从一个示踪剂读取数据包并写入许多。
我将libtrace_out_t **用于输出示踪剂。
初始化:
uint16_t size = 10;
libtrace_out_t** array = libtrace_out_t*[size];
for(uint16_t i = 0; i < size; ++i) {
array[i] = trace_create_output(uri); // created OK
trace_start_output(outTracers_[i]); // started OK
}
// writing packets
使用示踪剂数组的元素创建,启动和编写数据包都很好。
问题是由trace_destroy_output()引起的,当我在循环中销毁输出示踪剂时:
for(uint16_t i = 0; i < size; ++i)
{
if(outTracers_[i])
trace_destroy_output(outTracers_[i]);
}
在第一个迭代输出示踪剂上正在销毁罚款。
但是第二次,它在
pcap_close(pcap_t* p)
因为指针P具有值0x0。
有人可以解释我为什么会发生这种事情或如何正确销毁它?
从您发布的代码中,看起来您正在使用相同的URI创建10个输出轨迹。因此,从本质上讲,您已经创建了10个输出文件,所有文件都可能不是您想要的。
是时候销毁输出轨迹时,第一个销毁关闭了与您提供的名称匹配的文件,并将对该文件的引用设置为null。因为该引用现在为null,所以任何随后销毁该文件的尝试都会导致分段故障。
确保您为创建的每个新输出跟踪更改URI,并应解决问题。
示例:
/* I prefer pcapfile: over pcap: */
const char *base="pcapfile:output";
uint16_t size = 10;
libtrace_out_t* array[size];
for (uint16_t i = 0; i < size; ++i) {
char myuri[1024];
/* First output file will be called output-1.pcap
* Second output file will be called output-2.pcap
* And so on...
*/
snprintf(myuri, 1023, "%s-%u.pcap", base, i);
array[i] = trace_create_output(uri);
/* TODO Check for errors here */
if (trace_start_output(array[i])) {
/* TODO Handle error case */
}
}
另一个提示:libtrace已经包含了一个称为TracePlit的工具,该工具根据某些条件(例如数据包,输出文件的大小,时间间隔)将数据包分成多个输出跟踪。此工具可能已经在不需要编写代码的情况下完成了您想要的事情,或者至少在编写自己的代码时会做一个很好的例子。
我认为您在代码中有界限
中的范围访问uint16_t size = 5; /// number of tracers
for(uint16_t i = 0; i != size; ++i)
{
if(outTracers_[i])
trace_destroy_output(outTracers_[i]);
}
转化为
for(uint16_t i = 0; i <= 5; ++i)
{
...
}
和Outtracers _ [5]不是您的数组中的有效元素
相关文章:
- 数组C++问题中最大和第二大的数字
- 二维数组问题
- 数组问题:变量周围的堆栈'arr'已损坏
- 无符号字符数组问题
- 数组问题(if (zeds[i].x == zeds[i].x))
- 字符数组问题
- C++中的turbo数组问题
- 输入和输出的2D字符数组问题
- 多维数组问题
- 指针和数组指向数组问题
- 如何随机排列数组问题
- C++ 多维数组问题 - 多次打印条目
- C++ 2D 读入数组问题
- C++读入 2D 数组问题
- 指针和多维数组问题
- C++多项式类,指针数组问题
- 在数组问题(C++)中查找偶数
- 二维std::数组问题
- 向量/数组问题,不能给变量赋索引/不能使用变量作为数组大小(索引)c++
- 指针数组问题