Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc和free的使用_C_Malloc - Fatal编程技术网

malloc和free的使用

malloc和free的使用,c,malloc,C,Malloc,我正在尝试将mp4视频解码为YUV帧。我想为每个要解码的帧分配内存,如果我连续分配内存并释放它是否可以。这样做是否有任何问题(即,使用malloc和free有争议地分配和释放内存)?我最好一次分配足够的缓冲区并重用相同的缓冲区。除了一些性能问题外,重复使用malloc free不会带来任何问题。我最好一次分配足够的缓冲区并重用相同的缓冲区。除了一些性能问题外,重复使用malloc free不会带来任何问题。从技术上讲,只要不尝试访问已释放的内存,就不会有任何问题 另一方面,重复进行所有这些调用会

我正在尝试将mp4视频解码为YUV帧。我想为每个要解码的帧分配内存,如果我连续分配内存并释放它是否可以。这样做是否有任何问题(即,使用
malloc
free
有争议地分配和释放内存)?

我最好一次分配足够的缓冲区并重用相同的缓冲区。除了一些性能问题外,重复使用malloc free不会带来任何问题。

我最好一次分配足够的缓冲区并重用相同的缓冲区。除了一些性能问题外,重复使用malloc free不会带来任何问题。

从技术上讲,只要不尝试访问已释放的内存,就不会有任何问题

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

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


更新:@EricPostpischil在一篇有用的评论(见下文)中提到,malloc是一个库调用,而不是只有在当前堆耗尽时才会发生的系统调用。有关这方面的更多信息,请参见

,从技术上讲,只要不尝试访问已释放的内存,这一点都没有问题

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

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


更新:@EricPostpischil在一篇有用的评论(见下文)中提到,malloc是一个库调用,而不是只有在当前堆耗尽时才会发生的系统调用。有关这方面的更多信息,请参见持续的mallocing和free is不会破坏程序,但它会导致许多性能问题,特别是因为您说您将在每一帧都执行此操作。Mallocing和freeing通常会导致性能显著降低


您可以做的只是将内存malloc一次,然后对每个帧重复使用相同的分配。如果在读取下一帧之前,在对该帧执行所需操作后不需要存储内存,则没有任何问题。

不断地删除和释放is不会中断程序,但会导致许多性能问题,特别是因为您说要在每一帧执行此操作。Mallocing和freeing通常会导致性能显著降低


您可以做的只是将内存malloc一次,然后对每个帧重复使用相同的分配。如果在读取下一帧之前,在对帧执行了所需操作之后,不需要存储内存,则不会有任何问题。

如果分配的对象大小相同,则不会对性能造成太大影响。如果有疑问,请测量它


正确地跟踪分配的内存通常不是一件小事,所以一次分配一个缓冲区并在整个程序中使用它可能更容易。但这里的主要规则应该是使用与程序逻辑相对应的、最容易读取和维护的对象。

如果分配的对象大小相同,则性能不会受到太大影响。如果有疑问,请测量它


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

如果这样做,您可能会面临性能问题。。。否则它在技术上是正确的。如果您这样做,您可能会面临性能问题。。。否则,它在技术上是正确的。。反对票怎么了?我能解释一下吗?没有解释的否决票对任何人都没有帮助(OP,SO或我)。@Lundin谢谢。。我的意思是,我喜欢点击按钮,看着屏幕上的事情和下一个人一样发生变化,但说真的,有时候人们似乎很高兴。如果没有任何评论/理由/建议(!),我真的不明白否决投票的目的,没有人会从中受益。malloc是一个库调用,而不是一个系统调用。任何合适的实现只有在当前分配的堆耗尽时才进行系统调用。对于重复的malloc和相同大小的free,这不会发生。一个好的实现也可能以较低的开销支持这种情况。@EricPostFischil您是对的,感谢您对库与系统调用的澄清,我将更新答案。@DownVorters。。反对票怎么了?我能解释一下吗?没有解释的否决票对任何人都没有帮助(OP,SO或我)。@Lundin谢谢。。我的意思是,我喜欢点击按钮,看着屏幕上的事情和下一个人一样发生变化,但说真的,有时候人们似乎很高兴。如果没有任何评论/理由/建议(!),我真的不明白否决投票的目的,没有人会从中受益。malloc是一个库调用,而不是一个系统调用。任何合适的实现只有在当前分配的堆耗尽时才进行系统调用。对于重复的malloc和相同大小的free,这不会发生。一个好的实现也可能以较低的开销支持这种情况。@EricPostChil您是对的,谢谢您的支持