【问题标题】:what is the main reason of using malloc() in C在 C 中使用 malloc() 的主要原因是什么
【发布时间】:2014-12-24 03:18:46
【问题描述】:

我目前正在使用 C/C++。但是使用 malloc/new 而不是仅仅在堆栈上声明一些 var 的主要原因是什么。喜欢:int a;

或者另一个例子:

  1. int *a; // 然后用它来跟踪一个数组

  2. int a = (int)malloc(sizeof(int));

【问题讨论】:

  • 也许你希望一个值在函数返回后仍然存在,或者你想分配一个对于堆栈来说太大的巨大内存块。
  • C 和 C++ 是不同的语言。
  • 没有“主要原因”。有利有弊,无论您处于何种情况,它们都会发生变化。了解每种情况的作用,然后决定在这种情况下您是更愿意使用 malloc/new 还是堆栈。
  • 两个主要原因。 1. 分配超出分配函数范围的内存。 2. 分配大量内存,否则如果自动分配会有堆栈溢出的风险。
  • 我不敢相信这不是骗子,但我找不到...编辑:也许这个:stackoverflow.com/questions/14013620/using-malloc-over-array

标签: c malloc


【解决方案1】:

自动变量的生命周期在程序离开声明它们的代码块时结束。有时你希望他们活得更久;动态分配使您可以完全控制它们的生命周期。有时它们对于堆栈来说太大了;动态内存(通常)受到较少限制。

这种灵活性带来了责任:您需要在完成后删除它们,而不是之前。如果你试图抓住一个原始指针并自己做这件事,这很难做到。所以(在 ​​C++ 中)了解RAII,并使用现成的管理类型(如智能指针和容器)为您完成工作。

【讨论】:

    【解决方案2】:

    TL;DR:堆栈和堆是两个不同的内存区域,它们用于不同的目的,它们有自己的访问模式(包含所有暗示)和策略(是的,堆栈内存受到更多控制 比硬件强制系统上的堆内存)。

    堆栈内存是一种宝贵的、有限的资源,需要连续分配(不能像堆分配那样分块)。

    因此,它在许多 x86 平台上的默认尺寸通常约为 1 MB(尽管可以增加)。对于您可以通过堆分配分配多少内存来说绝对很小。您的问题与 this question 并不完全相同,但如果您对堆栈资源有限的其他原因感兴趣,我相信您应该看看它。

    其他原因包括可见性范围(堆栈内容在范围结束时被收集/销毁,而堆分配的内存可用于应用程序的其他部分,直到您释放它)。

    【讨论】:

      【解决方案3】:

      C 标准函数malloc() 及其朋友(free()calloc()realloc())允许在运行时动态分配任意大(操作系统允许)内存块。这具有动态存储持续时间的非正式名称(N1570中的正式名称是分配的存储持续时间),具有以下特征:

      • lifetimemalloc()free() 调用控制。这不太可能自动存储持续时间变量,它们的生命周期受范围(例如块,更准确地说是由{} 限制,VLA 除外)和静态存储持续时间,具有整个程序执行的生命周期
      • 范围由指向已分配数据的指针的可用性决定

      换句话说,当您需要运行时数据分配的最大灵活性时,您可以使用malloc()。自动变量实际上受到堆栈大小的限制,而静态变量需要在编译时保留确切(即静态)内存量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-03
        • 2012-05-29
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        相关资源
        最近更新 更多