问题描述
我是 C 编程的新手,一直在处理内存管理方面的事情。我有几个问题都与一个场景有关(我将问题以粗体显示)。如果我要分配 10 个字节(使用 malloc)的内存,但只用它来存储一个 int(4 个字节)
这会导致内存方面的问题吗?
额外的内存会怎样?
是必须手动释放还是有办法自动释放?
我是不是不应该费心费力地事先确定合适的尺寸?
感谢您提供的任何帮助,非常感谢
解决方法
这会导致内存方面的问题吗?
什么的哪一边,哪一边是内存?
它可能会使用不必要的内存。
额外的内存会怎样?
它仍然未使用。
它必须手动释放还是有办法自动释放?
在通用操作系统中,系统会在您的进程终止时恢复内存。如果您希望分配的内存在此之前可用于重用,则必须释放它。
我是不是应该不费心去搞乱,事先确定合适的尺寸?
适当的策略取决于具体情况。一些可能性是:
- 您分配了大量内存,执行将数据放入其中的操作,然后在了解数据大小后,使用
realloc
释放多余的内存。 - 您对所需的内存量做出公正的估计,确保达到或超过要求,而不是低于要求,然后分配该内存,并让多余的部分浪费掉。
- 您分配一些内存并开始操作以将数据放入其中。当您获取数据时,您会注意它是否填充了分配的数量。当需要更多时,您可以使用
realloc
获得更多。
出于您的目的,内存分配器不知道,也不真正关心您在 malloc 的块中实际使用了多少内存。这里的关键是永远不要使用 比 malloc 多的内存。额外的内存就在那里,如果需要,可以使用。
请注意,如果您没有执行此分配数千次,那么分配 10 个字节与 4 个字节不会产生太大影响(如果对您有任何影响)。
我建议您永远不要跳过的唯一验证/大小计算是确保您永远不会为放置在分配空间中的项目分配太少的内存。
从技术上讲,您不必释放内存(因为操作系统会在应用程序退出后清理您造成的混乱),但您绝对应该这样做。如果您在使用完内存后没有释放内存,这称为内存泄漏,并且会导致您的应用程序使用更多的 RAM。此外,要非常小心,在释放内存后不要再次使用它。这称为释放后使用,可能是一个危险的错误。
与其他一些语言相比,C 语言中的内存管理非常需要您手动完成。