例如,如果我在C字符串上分配了比所需更多的内存空间,是否有一种方法可以返回未使用的内存?或者这是自动完成的吗?
char *x = malloc(256);
strcpy(x, "Hello World");
// return back unused x memory allocation
realloc
改变分配的大小; 这可以用于使其更大或更小。`char *x;`
`x = malloc(256);`
`strcpy(x, "Hello");`
`x = realloc(x, (strlen(x) + 1));`
- lostAtSeaJoshuax = realloc(x, (strlen(x) + 1));
在理论上,甚至可以无法重新分配到小一些的内存 - 因此请检查返回值。 这只取决于您希望让代码变得多么有弹性。 - chux - Reinstate Monica这并不是自动完成的。这就是手动内存管理的好处和坏处。
您需要显式调用free(x);
来释放内存返回给操作系统。而且要跟踪您的malloc()
/free()
对是一件很麻烦的事情,但它会产生回报,因为您可以对程序使用的内存进行精细控制。
如果您想分配恰好的内存量,则应该这样做。通常,当您调用malloc()
时,您在编译时不知道分配大小,因此通常会分配确切的内存量。
如果您想要一个增长/缩小的内存缓冲区,则应考虑到malloc()
是一个昂贵的调用。因此,您通常会分配足够的内存 - 一个很好的估计量 - 然后在您知道它不会再增长时将其缩小,或者如果您估计过少则将其扩大。
malloc()
是一个昂贵的调用?有没有一个包含这些信息的列表?或者你是通过编写一个测试程序来测试它需要多长时间的? - user56202malloc()
。这是一个非常常用的策略。 - Iharob Al Asimi
delete
是在使用new
分配内存时使用的。在这种情况下应该是x = new[256];
然后使用delete[] x;
而不是delete x;
。 - Iharob Al Asimichar *x = strdup("Hello World");
或者至少char *x = malloc(12); if (x != NULL) strcpy(x, "Hello World");
。 - Iharob Al Asimimalloc(12)
而不是256呢? - Pablomalloc()
。因此,当你知道时,你应该现在确切地知道需要多少。 - Iharob Al Asimi