C++ 如何使用新&;删除数据包?

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

我现在正在处理一个FFmpeg项目,我必须存储来自
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;
}
我真的不知道defines
FF\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
,因此如果您想将数据设置为new
AVPacket

只需将内存复制到
AVPacket
的数据,完成后调用
av\u free\u packet

  • av_new_数据包
    创建数据包并分配数据
  • av_init_数据包
    将所有数据包成员设置为默认值,并将数据指针设置为
    NULL
    , 漏洞在这里
  • av_free_数据包
    清除所有可见成员,但 您的数据已经泄漏
如果希望FFmpeg为您分配数据,请不要调用
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