2012-08-27 68 views
1

我想解码成YUV帧的MP4视频。我想为每帧解码分配内存,如果我连续分配内存并释放内存,是否可以。这样做是否存在问题(即使用mallocfree来争用分配和释放内存)?malloc和免费使用

+1

如果这样做,您可能会遇到性能问题......否则它在技术上是正确的。 – shan

回答

5

我会更好地分配一次足够的缓冲区,并重新使用相同的缓冲区。除了某些性能下降外,重复的malloc-free不会造成任何问题。

4

从技术上讲,只要您不尝试访问已释放的内存,就完全没有问题。

另一方面,反复进行所有这些调用会产生一个开销,您可以(也应该)通过提前分配足够的内存来避免这种开销,然后在最后释放所有这些开销。

重复分配/释放的方法应该只在内存非常紧张的情况下使用,否则,根据需要保留一大块内存并分配一部分内存。或者,如果可能的话,重复使用同一块内存。

更新:作为一个有帮助的注释中提到的@EricPostpischil(见下文),malloc的是通话,而不是一个系统调用时,当前的堆被耗尽,因为这只会发生。欲了解更多信息,请参阅this explanation

+0

@downvoters ..什么是downvotes?我可以请你解释一下吗? Downvotes *没有*解释不会帮助任何人(OP,SO或我)。 – Levon

+0

+1来补偿:) – Lundin

+0

@Lundin谢谢..我的意思是,我喜欢点击按钮,看屏幕上的变化和下一个人一样多,但是严重的是,有时候人们似乎会触发快乐。我真的没有看到没有任何评论/理由/建议(!)的downvote的目的,没有人会以任何方式受益。 – Levon

0

不断mallocing和释放是不会破坏该程序,但它会导致很多性能问题,特别是因为你说你会在每一帧。通常会导致性能下降,并且释放。

你可以做的只是malloc内存一次,然后为每个帧重新使用相同的分配。如果您在读取下一帧之前完成所需内容后不需要存储内存,则没有任何问题。

1

如果您分配的对象具有相同的大小,则应该不会有太大的性能下降。如有疑问,请测量它。

正确地跟踪分配的内存通常不是微不足道的,因此分配一次缓冲区并在整个程序中使用它可能更容易。但是这里的主要规则应该是使用与你的程序逻辑相对应的内容,是最容易阅读和维护的。