C++ 如何使用新&;删除数据包?
我现在正在处理一个FFmpeg项目,我必须存储来自C++ 如何使用新&;删除数据包?,c++,ffmpeg,memory-leaks,C++,Ffmpeg,Memory Leaks,我现在正在处理一个FFmpeg项目,我必须存储来自av\u read\u frame的AVPacket的数据,并将数据填充到新的AVPacket中,以便后续解码 这是我的问题:当我尝试新建和释放AVPacket时,总是会发生内存泄漏 我只是在做一个简单的测试: for(;;) { AVPacket pkt; av_new_packet(&pkt, 1000); av_init_packet(&pkt); av_free_packet(&pk
av\u read\u frame
的AVPacket
的数据,并将数据填充到新的AVPacket
中,以便后续解码
这是我的问题:当我尝试新建和释放AVPacket
时,总是会发生内存泄漏
我只是在做一个简单的测试:
for(;;) {
AVPacket pkt;
av_new_packet(&pkt, 1000);
av_init_packet(&pkt);
av_free_packet(&pkt);
}
我做错了什么?我刚刚读了FFmpeg 2.2
AVPacket.c
源代码
int av_new_packet(AVPacket *pkt, int size) {
AVBufferRef *buf = NULL;
int ret = packet_alloc(&buf, size);
if (ret < 0)
return ret;
av_init_packet(pkt);
pkt->buf = buf;
pkt->data = buf->data;
pkt->size = size;
#if FF_API_DESTRUCT_PACKET
FF_DISABLE_DEPRECATION_WARNINGS
pkt->destruct = dummy_destruct_packet;
FF_ENABLE_DEPRECATION_WARNINGS
#endif
return 0;
}
void av_init_packet(AVPacket *pkt) {
pkt->pts = AV_NOPTS_VALUE;
pkt->dts = AV_NOPTS_VALUE;
pkt->pos = -1;
pkt->duration = 0;
pkt->convergence_duration = 0;
pkt->flags = 0;
pkt->stream_index = 0;
#if FF_API_DESTRUCT_PACKET
FF_DISABLE_DEPRECATION_WARNINGS
pkt->destruct = NULL;
FF_ENABLE_DEPRECATION_WARNINGS
#endif
pkt->buf = NULL;
pkt->side_data = NULL;
pkt->side_data_elems = 0;
}
int-avu新数据包(AVPacket*pkt,int-size){
AVBufferRef*buf=NULL;
int ret=数据包分配(&buf,大小);
如果(ret<0)
返回ret;
av_初始_数据包(pkt);
pkt->buf=buf;
pkt->data=buf->data;
pkt->size=size;
#如果FF_API_销毁_数据包
FF\u禁用\u弃用\u警告
pkt->destruct=dummy_destruct_数据包;
FF\u启用\u弃用\u警告
#恩迪夫
返回0;
}
无效av_初始_数据包(AVPacket*pkt){
pkt->pts=AV_NOPTS_值;
pkt->dts=AV_NOPTS_值;
pkt->pos=-1;
pkt->duration=0;
pkt->convergence_duration=0;
pkt->flags=0;
pkt->stream_index=0;
#如果FF_API_销毁_数据包
FF\u禁用\u弃用\u警告
pkt->destruct=NULL;
FF\u启用\u弃用\u警告
#恩迪夫
pkt->buf=NULL;
pkt->side_data=NULL;
pkt->side_data_elems=0;
}
我真的不知道definesFF\u API\u DESTRUCT\u数据包
,FF\u DISABLE\u depreaction\u警告
,FF\u ENABLE\u depreaction\u警告
由于某种原因,av\u-free\u数据包的破坏
leak
根据源代码,av_init_packet
在av_new_packet
中调用,av_new_packet
已经分配了AVBuffer
,因此如果您想将数据设置为newAVPacket
只需将内存复制到AVPacket
的数据,完成后调用av\u free\u packet
。
创建数据包并分配数据av_new_数据包
将所有数据包成员设置为默认值,并将数据指针设置为av_init_数据包
, 漏洞在这里NULL
清除所有可见成员,但 您的数据已经泄漏av_free_数据包
av\u init\u packet
。如果您想自己处理数据,请在堆栈上分配数据包对象,并自己设置数据(并释放数据):
也许现在事情已经改变了,因为文档说“注意,这不涉及数据和大小成员,它们必须单独初始化。”不,它没有改变。我认为这是一种误解。我指的是数据泄漏,而不是
数据
成员。更准确地说,前导的“数据指针”名称称为buf
。正是这个成员在init()函数中被设置为NULL,因此在free()函数中没有被释放。data
成员仅设置为指向某个成员或此buf
成员。(请参阅公认答案中公布的av_new_数据包代码,以获得更清晰的理解)
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = dataBuffer;
pkt.size = dataBufferSize;
// use your packet
// free your dataBuffer