VirtualDub过滤帧缓冲 - 释放内存

时间:2018-05-23 17:39:00

标签: c pointers malloc virtualdub

我正在编写一个VirtualDub过滤器,它需要一个单独的帧缓冲区,用于fa-> src.data和fa-> dst.data之间的中间图像处理(.data本质上是指向像素数据的指针)。

我使用以下方法创建了一个指向上面的字符:

/* 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 */

大多数时候,这似乎有效。但是,在一段时间后我得到了#34;模块"中发生了越界内存访问(访问冲突)。问题是我似乎耗尽了系统内存(VirtualDub在一段时间后占用了所有可用内存)。

我需要释放缓冲区吗?看起来很奇怪,因为它是每帧初始化的。我该如何释放它?

我试过免费(dstbuf)和免费(& dstbuf),但我得到了#34; Debug Assertion Failed"运行时出错,表达式:_CrtIsValidHeapPointer(pUserData)...没有太多其他内容。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

通过每次运行仅分配一次内存来解决。没有理由为每个帧分配内存,因为我一次只需要保留一个帧。