直截了当:需要在c ++中分配内存的原因是什么?
我了解一些编程语言会自动执行此操作,但是在C / C ++中:必须分配内存的原因是什么?例如: 声明PROCESSENTRY32时,为什么我们需要ZeroMemory()?当为套接字程序创建缓冲区时,为什么我们需要ZeroMemory()?声明int数据类型时,为什么不需要分配内存?
答案 0 :(得分:1)
您的问题确实没有道理。 ZeroMemory
不分配内存;恰好,将字节设置为0
。您可以根据需要轻松ZeroMemory
和int
。只是i = 0;
写得短些。
在所有情况下,ZeroMemory
仅对已经存在的内存起作用;即必须先分配其他东西。
对于实际分配,C区分对象的三种存储方式:
静态存储。这些对象在程序启动时分配,并且在程序运行期间一直存在。示例:全局变量。
自动存储。这些对象在执行达到其作用域时分配,并在执行离开其包含作用域时释放。示例:局部变量。
动态存储。您可以通过调用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之后。