1
7
您最好先保留分配的初始内存块,然后使用池将其提供给应用程序中的客户机。依靠深奥的行为来维护代码的稳定性是不好的形式。如果 任何东西 改变,你可能会处理坏的指针和程序崩溃。 |
2
5
你要的是 便携式的 以及控制 内存接口的操作系统端 . 论 任何 操作系统(因为C是最广泛移植的语言之一)。 想一想,请记住,OSS的结构和目标各不相同,其需求和属性也各不相同。 通常的C API只定义了从接口的C端看事物应该如何表现,而不是在操作系统端应该如何表现,这是有原因的。 |
3
4
|
4
4
你不能
可移植地
依赖于
|
5
4
嗯,不。
这是因为许多操作系统
内存过量使用
-承诺无论应用程序请求什么,不管可用的物理内存是多少,希望不是所有的内存都将被应用程序使用,其他应用程序释放内存/终止,并作为最后的手段放弃交换。在Linux上说
当内存被实际引用时,内核必须找到可用的物理页来备份它,创建/更新页表和TLB等——对页错误的正常处理。所以,同样的,不,除非你去触摸分配的块中的每个页面,否则你以后不会得到任何加速。 披露者:上述内容对于Windows可能不准确(因此,不,再次-没有任何接近便携式的东西)。 |
6
3
不,没有保证释放()不会释放内存,也没有保证第二个malloc会成功。 即使是“一般”不将内存返回到操作系统的平台,有时也会这样做(如果可以的话)。你可能会以你的第一个malloc成功而告终,而你的下一个malloc却没有成功,因为同时系统的其他部分耗尽了你的内存。 |
7
3
一点也不。它根本不便携。此外,不能保证另一个进程不会使用问题中的内存—C运行在许多设备上,如嵌入式设备,其中虚拟内存寻址不存在。它也不会减少碎片化——你必须知道机器的页面大小并分配精确的页面数量——然后,当你释放它们时,它们就会再次被取消碎片化。 如果您真的想保证内存不正确,可以使用malloc来创建一个大的块,并手动将对象放入其中。这是唯一的办法。至于效率,你必须在一个极度匮乏的设备上运行,以节省一些IFS。 |
8
3
malloc(3)也做mmap(2),因此,free(3)做munmap(2),因此,第二个malloc()理论上会失败。 |
9
1
C标准可以理解为需要这一点,但从实践的角度来看,有一些已知的实现并不遵循这一点,因此无论是否需要,您都不能真正依赖它。 因此,如果您希望保证这一点,那么您将非常需要编写自己的分配器。一个典型的策略是从malloc(或其他)中分配一个大的块,并为程序的其余部分分配子块,以便从该大块(或可能是多个大块)中使用。 |
altair00 · 使用“realloc”调整现有阵列的大小` 2 年前 |
cobb208 · Malloc正在为释放指针引发错误 2 年前 |
mbilyanov · 比较C中动态分配的字符串 2 年前 |
Jaques · “.exe”已触发断点 6 年前 |
Ultraviolence · 在C中使用malloc分配动态内存 6 年前 |
Andre · C分段错误:函数中的fscanf 6 年前 |
Gameatro · 为什么malloc在函数内部调用时返回空指针? 6 年前 |