可用存储空间会消耗更多剩余内存吗?

Can The Free Storage Consume More Memory Left Over?

本文关键字:余内存 内存 存储空间      更新时间:2023-10-16
int memory()
{
int* p = new int[10000];
}

这会使 10000 个整数无法用于本地内存之类的东西吗? 我不知道是不是这样。

new

用于将请求的内存量(如果可用(分配给您请求的对象/数组变量。在您的情况下,指针p将存储到此分配的内存块的地址。

只有有限的内存可供您使用,因此您的程序只能使用该内存量。这将因系统而异,但将是有限的。当您请求分配的内存多于可以分配的内存时,程序可能会抛出一些异常,例如std::bad_alloc,以指示分配存储失败,如果不处理,将导致程序崩溃。

为免费存储分配的内存是否会影响整个 程序的可用内存?

是的。

程序中的内存分配将来自堆存储(C++知道是否为空闲存储(。要回答您的问题,是的,分配的内存将减少可供其他变量使用的可用内存量。没有无限量的内存可供程序使用。因此,一旦用完所有可用空间,您最终可能会耗尽内存空间。但是,您也可以在内存工作完成后释放内存,方法是使用运算符delete释放已用内存空间并使其再次可用。

分配给您的内存空间将基于实现。C++本身对堆或内存如何分配给它一无所知。

实际上:所有存储都使用内存(除非优化(。

如果分配了 40000 字节,并且操作系统没有 40000 字节可用(加上可用存储用于管理内存的开销(,则操作系统必须采取措施来释放一些内存 - 通常通过终止进程或其他一些进程。此操作可能会延迟到实际使用内存时,而不是在分配时立即延迟。

这些都没有在C++语言中指定,并且是C++语言的实现如何行为的示例。其他实现可能有所不同。

在(便携式(C++中,您真的不知道有多少内存以及它可以用于什么。

new从免费存储中分配,局部变量在本地存储中分配。然后你有静态存储和线程本地存储(以及其他一些更"神奇"的东西,比如放置异常对象的存储(。

然而,对于C++语言,所有这些内存位置都神奇地来自这些调用或语法结构,每个调用或语法结构都有其特定的语义,例如,您无法知道(可移植地(每种类型有多少内存,并且您无法知道分配一种类型的内存是否会降低另一种类型的可用内存量。也许是,也许不是。

甚至考虑一下,例如对于本地存储,您无法知道是否耗尽了可用的本地内存,因为分配过多本地存储的结果根本无法定义:考虑一下......您无法知道有多少本地内存,但您不能尝试使用超过未知数量的内存,因为系统没有进行任何检查,并且您直接跳入未定义的行为地狱。

因此,例如对于本地存储,唯一实用的建议是不要使用"太多"。