我正在尝试将 mp4 视频解码为 YUV 帧。我想为每个要解码的帧分配内存,如果我连续分配内存并释放它是否可以。这样做有什么问题吗(即,使用malloc
and有争议地分配和释放内存free
)?
4 回答
我最好分配一次足够的缓冲区并重用相同的缓冲区。除了一些性能损失之外,重复的 malloc-free 不会造成任何问题。
从技术上讲,只要您不尝试访问已经释放的内存,这根本没有问题。
另一方面,重复进行所有这些调用会产生开销,您可以(并且应该)通过提前分配足够数量的内存,然后在最后释放它来避免。
重复分配/释放的方法实际上应该只在内存非常紧张的情况下使用,否则,保留一大块内存并根据需要自行分配部分内存。或者,如果可能,重用相同的内存块。
更新:正如@EricPostpischil 在有用的评论中提到的(见下文),malloc 是一个库调用,而不是仅在当前堆耗尽时才会发生的系统调用。有关这方面的更多信息,请参阅此说明
如果您分配的对象具有相同的大小,则应该不会对性能造成太大影响。如有疑问,请测量它。
正确跟踪分配的内存通常并非易事,因此分配一次缓冲区并在整个程序中使用它可能更容易。但是这里的主要规则应该是使用与您的程序逻辑相对应的东西,最容易阅读和维护。
不断地分配和释放不会破坏程序,但会导致很多性能问题,特别是因为你说你将在每一帧都这样做。分配和释放通常会导致性能明显下降。
您可以做的只是 malloc 一次内存,然后为每个帧重新使用相同的分配。如果您在读取下一帧之前对帧完成了您想要的操作之后不需要存储内存,那么没有任何问题。