【问题标题】:How can I return unused allocated memory in C?如何在 C 中返回未使用的分配内存?
【发布时间】:2018-02-04 00:58:35
【问题描述】:

例如,如果我在 C 字符串上分配了更多的内存空间,那么有没有办法返回未使用的内存?还是自动完成?

char *x = malloc(256);
strcpy(x, "Hello World");
// return back unused x memory allocation

【问题讨论】:

  • @Arvnid!!!这在c 中不存在。如果在 c++ 中执行此操作,则会调用未定义的行为,因为在使用 new 进行分配时会使用 delete。在这种情况下,它会是x = new[256];,然后delete x; 也是错误的,它会是delete[] x;
  • BWT:char *x = strdup("Hello World"); 或至少 char *x = malloc(12); if (x != NULL) strcpy(x, "Hello World");
  • 如果你知道你将只使用 12 个字节,那么为什么不使用 malloc(12) 而不是 256?
  • 完成@Pablo 的评论,你应该使用malloc(),当你不知道要分配多少内存直到运行时。因此,当您知道时,您现在应该确切地了解多少。
  • @IharobAlAsimi 如果在编译时不知道内存空间怎么办?例如在用于用户输入或读取文件并处理未知字符串大小的程序中。

标签: c string memory malloc


【解决方案1】:

您可以调用realloc 来更改分配的大小;这可用于使其变大或变小。

计算机将没有依据自动缩小您的分配。

【讨论】:

  • 事后将字符串重新分配到字符串 + 1 的长度是否安全?例如:char *x;x = malloc(256);strcpy(x, "Hello");x = realloc(x, (strlen(x) + 1));
  • 只要您不尝试访问已释放的部分,当然可以。
  • @lostAtSeaJoshua x = realloc(x, (strlen(x) + 1));,理论上,即使分配到较小的分配,也可能无法重新分配 - 所以检查返回值。这仅取决于您希望编写代码的弹性。
  • @chux 是的,我在 realloc 上添加了返回 null 时的错误处理。
【解决方案2】:

这不是自动完成的。这就是手动内存管理的优点和可怕之处。

您需要显式调用free(x); 将内存释放回操作系统。跟踪您的 malloc()/free() 对是一件很痛苦的事情,但它是有回报的,因为您可以对程序使用的内存进行细粒度的控制。

如果您只想分配确切数量的内存,那么您应该这样做。通常,当您调用malloc() 时,您在编译时不知道分配大小,因此通常您会分配确切的内存量。

如果你想要一个增长/缩小内存缓冲区,你应该考虑到malloc() 是一个昂贵的调用这一事实。因此,您通常会分配足够(对您需要多少的一个很好的估计)内存,然后当您知道它不会增长更多时将其缩小,或者如果您估计太少则增长它。

【讨论】:

  • 有什么好的部分?
  • @ScottHunter 您可以很好地控制程序的内存分配。如果你小心,并使用正确的工具,你将能够编写内存高效的代码而不会出现任何错误。
  • 我认为这比“好”更“有用”,但是 YMMV。
  • @IharobAlAsimi 在寻找 YMMV 时,您的里程可能会有所不同。
  • @IharobAlAsimi 初学者在这里。你怎么知道malloc() 是一个昂贵的电话?是否有包含此信息的列表?或者您是否编写了一个程序来测试需要多长时间?
猜你喜欢
  • 1970-01-01
  • 2014-01-30
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多