【问题标题】:Allocate memory at runtime在运行时分配内存
【发布时间】:2012-02-05 22:23:27
【问题描述】:

我想知道我们如何在 C 或 C++ 中的运行时分配内存块而不使用malloccalloc 函数。

【问题讨论】:

  • 你需要得到a good book
  • 您可能需要浏览一些教程。
  • Stack Overflow 不是学习语言的好地方。而且它当然不是学习两种语言的好地方!
  • ...为什么不呢? malloc 怎么了?

标签: c++ c memory-management


【解决方案1】:

在 C 中,使用 malloc。使用后别忘了free

在 C++ 中,使用new,不要忘记delete。或者更好的是,如果您需要动态数组,请使用 std::vector

【讨论】:

  • 对不起,我忘了说这是在没有 malloc 和 calloc 的情况下完成的。
  • @AmitSharma:那么您需要使用特定于平台的 API。 malloc 是标准 C 中唯一可移植的动态分配机制。
【解决方案2】:

在 C 中,使用 VLA ...

/* fill an array, allocated dinamically without malloc,
** with 1, 2, 3, 4, ...
** then sum all of the values and print the result */
#include <stdio.h>

void vlaalloc(size_t nmemb, size_t siz, void (*fx) (void *, size_t)) {
  unsigned char data[nmemb * siz];

  fx(data, nmemb);
}

int arraysum(int *arr, size_t len) {
  int val = 0;
  for (size_t i = 0; i < len; i++) val += arr[i];
  return val;
}

void seq(void *data, size_t len) {
  int *arr = data;
  for (size_t i = 0; i < len; i++) arr[i] = i + 1;
  printf("array sum is %d\n", arraysum(arr, len));
}

int main(void) {
  int n;

  if (scanf("%d", &n) == 1) {
    vlaalloc(n, sizeof (int), seq);
  }
}

code running at ideone

【讨论】:

    【解决方案3】:

    C 中的 malloc 或 C++ 中的 new

    【讨论】:

      【解决方案4】:

      在 C 中使用 malloc()

      int *a = malloc (sizeof(int) * block_size);

      在 C++ 中使用new

      int *a = new int[block_size];

      注意:此代码使用原始指针。 C++11 有更好的指针,例如unique_ptrshared_ptr。与原始指针相比,首选这些智能指针通常是一种好习惯。

      编辑:OP 需要一个块,所以我正在更新代码

      【讨论】:

      • 在 C 中,不要强制转换 malloc 的返回值。演员阵容充其量是多余的。并且可能隐藏编译器在没有它的情况下会捕获的错误。
      • C++03有auto_ptr,不如unique_ptr,但实现了自动清理。
      • 但是反过来auto_ptr有很多问题,所以最好使用boost智能指针。
      【解决方案5】:

      除非我错过了您的问题的重点,否则您只需要使用 C++ 语言标准结构:new 和 delete/delete[]。

      【讨论】:

      • new 和 delete 在幕后使用 malloc 和 free。
      • 不,他们可能。但他们根本不必这样做。
      【解决方案6】:

      在 C 中你可以使用:

      malloc() 
      

      在 C++ 中:

      malloc()
      calloc()
      

      在 C++ 中,最好使用 new-operator。

      【讨论】:

      • @Xeo:这个问题专门讨论了分配内存(不是构造对象或原始值)。所以指出 c++ 的 malloccalloc 肯定没有错(尽管可以说是不完整的)。
      • @FrerichRaabe:我们仍然有一个new::operator new(std::size_t size)。通常在 C++ 中,您确实只想分配内存。
      • calloc 是一个 C 函数,它不是 C++ 特定的。
      • @Xeo:这是正确的(我同意显式资源管理不是一个好主意),但同样:使用malloc 在运行时分配内存块当然可以,正如操作。实际上,在实现您自己提到的 new 重载时使用它是一个合理的功能!请注意,答案确实也提到了it's better to use the new-operator
      • @FrerichRaabe:我可以发誓最后一句话是在我发表评论后编辑的……无论如何。我的意思是,在 C++ 中(大多数时候)没有充分的理由只分配内存而 not 在其中构造一些东西。如果你发现自己需要它,你要么实现一个库,要么正在玩一些你不应该做的事情。如果你属于前一组,你应该使用std::vector&lt;char&gt;或likes。
      【解决方案7】:

      我不确定你的问题,但简单的答案是使用

      C:

      malloc();
      

      C++:

      new
      

      这将返回一个指向内存的指针,操作系统会帮你找到它。

      【讨论】:

        【解决方案8】:

        在C语言中,所有的内存分配都是通过malloc完成的(规则里有),所以如果你想要malloc以外的东西,那就要看你用的是什么平台了,你没说。

        在 Linux 上,mmap 可能会做你想做的事。毫无疑问,windows 还有其他东西。

        在某些系统上,您可能无需询问即可获取它,只要您知道所有内容在哪里,但这主要仅适用于使用基本(或没有)操作系统的嵌入式系统。

        【讨论】:

          猜你喜欢
          • 2017-06-06
          • 2017-06-16
          • 1970-01-01
          • 2013-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多