Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么需要在c/c++;? 直截了当:在C++中需要分配内存的原因是什么?_C++_C_Memory_Memory Management - Fatal编程技术网

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

为什么需要在c/c++;? 直截了当:在C++中需要分配内存的原因是什么?,c++,c,memory,memory-management,C++,C,Memory,Memory Management,我知道有些编程语言是自动完成的,但在C/C++中:需要分配内存的原因是什么。例如: 声明PROCESSENTRY32时,为什么需要将其归零?为套接字程序创建缓冲区时,为什么需要将其归零?为什么在声明int数据类型时不需要分配内存 你的问题没有真正意义零内存不分配内存;它只是将字节设置为0。如果需要,您可以轻松地ZeroMemoryanint。只是i=0写起来比较短 在所有情况下,ZeroMemory只对已经存在的内存起作用;i、 e.以前一定有别的东西分配了它 对于实际分配,C区分了对象的三种存

我知道有些编程语言是自动完成的,但在C/C++中:需要分配内存的原因是什么。例如:
声明PROCESSENTRY32时,为什么需要将其归零?为套接字程序创建缓冲区时,为什么需要将其归零?为什么在声明int数据类型时不需要分配内存

你的问题没有真正意义<代码>零内存不分配内存;它只是将字节设置为
0
。如果需要,您可以轻松地
ZeroMemory
an
int
。只是
i=0写起来比较短

在所有情况下,
ZeroMemory
只对已经存在的内存起作用;i、 e.以前一定有别的东西分配了它

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

  • 静态存储。这些对象是在程序启动时分配的,并在程序运行时一直有效。示例:全局变量

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

  • 动态存储。这是您通过调用
    malloc
    /
    calloc
    /
    realloc
    /
    free
    手动管理的内容

  • 唯一需要自己分配内存的情况是第三种情况。如果你的程序只使用自动存储,你不需要做任何特殊的事情

    在Java这样的语言中,您仍然需要通过调用
    new
    来分配内存。Python没有
    new
    ,但例如,每当您执行
    […]
    {…}
    之类的操作时,它都会创建一个新的列表/字典,用于分配内存。 关键的一点是你不必释放内存

    像Java或Python这样的语言包括一个垃圾收集器:您创建对象,但该语言负责清理您身后的垃圾。当对象不再需要1时,它将自动解除分配

    C不会那样做。原因在于它的历史:C是作为汇编代码的替代品被发明的,目的是使将Unix移植到新的计算机上更容易。自动垃圾收集需要一个运行时系统,这增加了复杂性,并且可能会有性能问题(即使是现代垃圾收集器有时也会暂停整个程序以回收内存,这是不可取的,而C是1972年创建的)

    没有垃圾收集器会导致C

    • 易于实现
    • 更容易预测
    • 可能更有效
    • 能够在非常有限的硬件上运行
    C++本应是一个“更好的C”,面向同样类型的受众。这就是为什么C++几乎保留了C的所有特性,即使是那些对自动垃圾收集非常不友好的原因。

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

    C选择相对低级的语言,其中语言构造或多或少直接映射到最多几个机器指令

    块级分配,例如

    int main()
    {
       int a,b,c; //a very cheap allocation on the stack
       //... do something with a, b, and c
    }
    
    属于这一类,因为函数中的所有块级分配通常只转换为对堆栈指针的一次减法

    这些分配的缺点是它们非常有限--您不应该像这样分配大对象或多个对象(或者您可能会遇到堆栈溢出的风险),而且它们也不是非常持久--它们在作用域的末尾被有效地撤消


    至于来自主内存的通用分配,除了大量的
    字符(即RAM)和可能的虚拟内存映射功能(即将真实内存映射到较小的字符数组)之外,机器实际上并没有为您提供太多。有多种方法可以分割这些数组,并使用和重用这些片段,因此C将其留给库。C++在C. 

    分配内存超出了它分配的范围之后。4)动态分配内存的主要原因是,这样你就可以控制对象的生命周期。如果让语言来做,对象的生命周期是预定义的(而且定义非常严格),但是通过使用“动态”分配,您可以显式地控制其生命周期何时结束以及何时销毁(以及调用析构函数时对象的生命周期)。Python和Java在为您处理内存时所做的操作被调用我认为,C++设计的运行速度尽可能快,引导了很多设计选择。我怀疑Stroustrup(C++创建者)不想花费计算能力来跟踪内存,当你想多快(慢?)时,你能理解它吗?CPU出现在20世纪70年代末/80年代初。我已经编写了大量没有
    malloc
    的被占用/裸机固件。动态分配超出了它的范围。因此,您可以将内存返回给调用者,调用者可以随心所欲地使用内存。如果没有内存分配,调用者需要提前知道需要多少字符用户输入到你的程序。试着告诉用户。比如“如果你输入超过8个字符,软件就会崩溃”。首先想想他们会这样做-输入9,看看会发生什么。Python和Java使用的方式,更动态的分配方式只有一个被解释,另一个有垃圾collector@JohnPhode:请不要使用
    malloc()C++程序中的代码/代码>这是一种简单的语言(C)的C++。C++有完全不同的内存处理技术,C.也使用现代C++,使用辅助对象(智能指针)来执行细粒度的确定。