为什么需要在c / c ++中分配内存?

时间:2018-11-16 21:07:26

标签: c++ c memory memory-management

直截了当:需要在c ++中分配内存的原因是什么?

我了解一些编程语言会自动执行此操作,但是在C / C ++中:必须分配内存的原因是什么?例如: 声明PROCESSENTRY32时,为什么我们需要ZeroMemory()?当为套接字程序创建缓冲区时,为什么我们需要ZeroMemory()?声明int数据类型时,为什么不需要分配内存?

2 个答案:

答案 0 :(得分:1)

您的问题确实没有道理。 ZeroMemory不分配内存;恰好,将字节设置为0。您可以根据需要轻松ZeroMemoryint。只是i = 0;写得短些。

在所有情况下,ZeroMemory仅对已经存在的内存起作用;即必须先分配其他东西。

对于实际分配,C区分对象的三种存储方式:

  1. 静态存储。这些对象在程序启动时分配,并且在程序运行期间一直存在。示例:全局变量。

  2. 自动存储。这些对象在执行达到其作用域时分配,并在执行离开其包含作用域时释放。示例:局部变量。

  3. 动态存储。您可以通过调用malloc / calloc / realloc / free来手动管理。

唯一真正需要自己分配内存的情况是案例3。如果您的程序仅使用自动存储,则无需执行任何特殊操作。

在Java之类的语言中,您仍然必须通过调用new来分配内存。 Python没有new,但例如每当执行[...]{...}之类的东西时,它都会创建一个新的列表/字典,该列表/字典分配内存。 至关重要的部分实际上是您不必释放内存。

Java或Python之类的语言包括垃圾收集器:您创建对象,但是该语言负责清理后面的内容。当不再需要对象 1 时,它会自动释放。

C不会那样做。原因在于它的历史:发明C来代替汇编程序代码,以使Unix轻松移植到新计算机上。自动垃圾收集需要一个运行时系统,这会增加复杂性并可能导致性能问题(甚至现代的垃圾收集器有时也会暂停整个程序以回收内存,这是不可取的,C语言是在1972年创建的。)

没有垃圾收集器会使C

  • 更易于实施
  • 更容易预测
  • 效率更高
  • 可以在非常有限的硬件上运行

C ++旨在成为“更好的C”,针对相同类型的受众。这就是为什么C ++保留了几乎所有C功能的原因,甚至包括那些对自动垃圾回收非常不友好的功能。


1 并非完全正确。当无法访问内存时,将对其进行回收。如果程序仍然可以某种方式到达某个对象,即使不再需要它,它也将保持活动状态(另请参见:Space leak)。

答案 1 :(得分:1)

C选择为相对底层的语言,其中语言构造或多或少直接映射到最多一些机器指令。

块级分配,例如in

int main()
{
   int a,b,c; //a very cheap allocation on the stack
   //... do something with a, b, and c
}

属于此类别,因为所有范围分配通常都将转换为堆栈指针的一个减法。

这些分配的缺点是它们非常有限-您不应该像这样分配大对象或多个对象或x,否则您可能会面临栈溢出的风险,并且它们不是持久的,即它们是有效的在范围末尾撤消。

对于从主内存进行的一般分配,除了大量的char(您的RAM)以及可能的某些虚拟内存映射功能(即,将实际内存映射到较小的char数组)之外,该机器实际上并没有为您提供太多服务。有很多方法可以将它们切成薄片并使用和重用,因此C留给了程序员。 C ++紧随C之后。