c - VirtualDub 过滤器帧缓冲区 - 释放内存
问题描述
我正在编写一个 VirtualDub 过滤器,它需要一个单独的帧缓冲区用于 fa->src.data 和 fa->dst.data 之间的中间图像处理(.data 本质上是一个指向像素数据的指针)。
我使用以下方法创建了一个指向上述内容的 char 指针:
/* Pointers to source and destination frame stores */
char *src = (char *)fa->src.data;
char *dst = (char *)fa->dst.data;
/* Image width and height */
int w = fa->src.w*sizeof(Pixel32);
int h = fa->src.h*sizeof(Pixel32);
然后,这允许我逐行将数据从源帧复制到目标帧:
memcpy(dst,src,w);
现在我想要一个中间缓冲区,我可以从 *dst 复制到缓冲区,然后从缓冲区复制到 *src。我怎样才能做到这一点?
我尝试了几件事并取得了不同程度的成功。
/* Define and initialise char array with malloc */
char *buf = (char*)malloc(w*h);
然后:
memcpy(buf,src,w); /* copy to buffer */
memcpy(dst,buf,w); /* copy from buffer to dst */
大多数时候,这似乎有效。但是,过了一会儿,我得到“模块中发生了越界内存访问(访问冲突)”。问题是我似乎用完了系统内存(VirtualDub 会在一段时间后占用所有可用内存)。
我需要释放缓冲区吗?看起来很奇怪,因为它每帧都被初始化。我怎样才能释放它?
我尝试了 free(dstbuf) 和 free(&dstbuf) 但在运行时出现“Debug Assertion Failed”错误,表达式:_CrtIsValidHeapPointer(pUserData)... 没有别的。
有任何想法吗?
解决方案
通过每次运行仅分配一次内存来解决。没有理由为每一帧分配内存,因为我一次只需要保存一帧。
推荐阅读
- angular - Angular5 + SocketIO 来提升::Beast
- python - 如果满足条件,则替换 3D 数组中的 2D 子数组
- javascript - 我的threejs材料有一些颜色问题
- php - 我们可以在准备语句的查询中进行查询吗?
- android - Android Studio 3.1.2,无法解决依赖问题
- selenium - 如何使用远程 Web 驱动程序设置/配置具有所需功能的 winium 和 webdriver?
- python - python在深层节点xml中查找标签
- json - 如何为整数数组编写正则表达式?
- google-analytics - 在 Google 分析中意外混合了 2 个属性的数据。我可以将它们向后分开吗?
- cmd - cmd 属性和默认设置不同步