我是否在 c 中过度使用了 malloc

  • 本文关键字:malloc 是否 c malloc
  • 更新时间 :
  • 英文 :


我正在努力学习c。我知道malloc()分配了一个字节块,如果没有用户请求,这些字节无法更改或损坏,但是我发现自己经常使用它。确切地说,每次我想创建一个结构或我想在未来引用的任何内容时,我都会使用 malloc。我也理解在分配的内存完成后free()它。

我对malloc的使用是否正确?

动态内存分配(malloc和系列(有两个原因:

  • 您的数据需要超出分配的范围(例如多线程(
  • 无论您分配什么,对于您的堆栈来说都太大了

您确实应该避免出于任何其他原因分配动态内存。自动(堆栈(变量更不容易出错,并且在作用域结束时会自动为您解除分配。

像你所说的"损坏的内存"只能真正由糟糕的编程引起,并且可能发生在堆栈和堆上,你不应该依赖动态内存来提供缓冲区溢出或其他导致内存损坏的错误的安全性。

C 标准库中的许多函数获取指向缓冲区的指针作为放置结果的参数是有原因的:它允许您在堆栈上分配这些缓冲区。 例如:

 ssize_t read(int fd, void *buf, size_t count);

正如另一个答案所提到的:您的堆栈内存已经在 CPU 缓存中,因此访问速度要快得多。

还请考虑其他类型的分配:

int foo;

块外部将分配一个全局变量,该变量在进程的整个生命周期中处于活动状态,并且对程序的其他模块可见。

static int foo;

块外部是相同的,但仅在实际模块中可见。

int foo;

内部只有在块中的代码运行时才处于活动状态,然后它被销毁。

static int foo;

内部仅在块中可见,但它在进程的整个生命周期内保留其值。

我正在做很多嵌入式 C 编码,并且绝对禁止使用 malloc((。这是完全可能的。如果你在编译时不知道问题的大小,你通常需要 malloc((。但即使在某些情况下,您也可以用其他技术(如递归、基于行的处理等(替换动态内存分配。

这取决于你的意思

没有用户请求,无法更改或损坏

如果你指的是代码 - 那么它通常被称为客户端,而不是用户。目前还不清楚你的意思是什么。但这不是重点。

关键是malloc()是用于动态内存分配的函数之一。这意味着您可以将此函数返回的地址传递到其他地方,并且存储在那里的数据将在那里,直到手动解除分配为止。与静态内存分配不同,静态内存分配在超出范围时会自动释放。

因此,如果在同一范围内释放了malloc()分配的内存,您可能不应该使用它,只是因为它毫无意义,并且因为静态分配更快,因为 CPU 更容易缓存并且它在程序启动时初始化,而不是在运行时作为堆分配的内存。

相关内容

  • 没有找到相关文章

最新更新