我在c中过度使用malloc吗?

时间:2013-10-07 05:38:57

标签: c malloc

我正在学习c。我知道malloc()分配了一个字节块,在没有用户请求的情况下无法更改或损坏,但我发现自己经常使用它。确切地说,每次我想创建一个结构或者我想在将来引用的任何内容时,我都在使用malloc。我完全理解free()已分配的内存。

我对malloc的使用是否正确?

3 个答案:

答案 0 :(得分:2)

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

  • 您的数据需要超出分配范围(例如多线程)
  • 无论你分配的是什么,对于你的筹码来说太大了

你应该避免为任何其他原因分配动态内存。自动(堆栈)变量更不容易出错,并在范围结束时自动为您解除分配。

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

有一个原因可以解释为什么C标准库中的许多函数都会获得一个指向缓冲区的指针作为将结果放入的参数:它允许您在堆栈上分配这些缓冲区。 e.g:

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

另外如另一个答案所述:您的堆栈内存已经在CPU缓存中,因此可以更快地访问。

答案 1 :(得分:1)

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

int foo;
块外的

将分配一个全局变量,该变量在过程的整个生命周期内都是活动的,并且对于程序的其他模块是可见的。

static int foo;
块外的

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

int foo;

块中的

只有当块中的代码运行时才会存活,然后它就会被破坏。

static int foo;
块内的

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

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

答案 2 :(得分:0)

这取决于你的意思

  没有用户请求,

无法更改或损坏

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

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

所以,如果由它分配的内存在同一范围内释放,你可能不应该使用malloc(),因为它没有意义,因为静态分配更快,因为CPU更容易缓存并且在程序启动,而不是在运行时作为堆分配的内存。