【发布时间】:2019-04-20 02:03:35
【问题描述】:
切入正题:在 c++ 中需要分配内存的原因是什么?
我了解某些编程语言会自动执行此操作,但在 C/C++ 中:必须分配内存的原因是什么。例如: 在声明 PROCESSENTRY32 时,为什么我们需要 ZeroMemory() 呢?在为套接字程序制作缓冲区时,为什么我们需要 ZeroMemory() 呢?为什么声明 int 数据类型时不需要分配内存?
【问题讨论】:
-
分配的内存超过了它被分配的范围。
-
4) “动态”分配内存的主要原因是您可以控制对象的生命周期。如果您让语言来执行此操作,则对象的生命周期是预先定义的(并且定义非常严格),但是通过使用“动态”分配,您可以显式控制其生命周期何时结束以及何时被销毁(因此对于调用析构函数时的对象)。
-
Python 和 Java 在为您处理内存时所做的事情称为“垃圾收集”(略读:“en.wikipedia.org/wiki/Garbage_collection_(computer_science)”)。在我看来,我认为 C++ 被设计为尽可能快的运行时,这指导了许多设计选择。我怀疑 Stroustrup(C++ 的创建者)不想花费计算能力来跟踪内存,当您想到 1970 年代末/1980 年代初 CPU 有多快(慢?)时,这是可以理解的。
-
我已经编写了大量没有
malloc的嵌入式/裸机固件。动态分配超出了它的范围。因此,您可以将内存返回给调用者,他可以随心所欲地使用内存。在没有内存分配的情况下,调用者需要提前知道用户将输入多少字符到您的程序中。试着告诉用户。比如“输入超过 8 个字符软件会崩溃”。首先认为他们这样做 - 输入 9 看看会发生什么。 Python和Java使用方式,方式更多动态分配只有一个被解释,另一个有垃圾收集器 -
@JohnPhode:请不要在 C++ 程序中使用
malloc()。这只是另一种语言(C)的保留。 C++ 具有与 C 完全不同的内存处理技术。此外,在现代 C++ 中,我们使用辅助对象(智能指针)内联执行细粒度确定性垃圾收集,而不是依赖于 Java 和 Python 等语言使用的单独的整体垃圾收集系统。
标签: c++ c memory memory-management