【问题标题】:does new[] resereve invisible storage? c++ dynamic memory allocationnew[] 是否保留隐形存储? c++动态内存分配
【发布时间】:2018-04-13 02:15:49
【问题描述】:

所以我注意到了一些奇怪的事情。我为我的程序留出了 4 GB 的物理内存。我已经分配了 2 GiB 的存储空间,我尝试使用下面的代码添加 1 GiB。然后程序抛出一个错误的分配,说内存已满。所以我想知道我是否分配了 1 GiB 使用。

char* p1 = new char[1073741824];

这是否会保留一些未使用任务管理器或资源监视器显示的额外存储空间?

使用 Visual Studio 2017 Windows 10。

【问题讨论】:

  • 发生这种情况的原因是您需要连续 1GB 内存。可能,您剩余的 2GB 相当分散。
  • “为什么我的巨大分配失败?”有很多重复。 Here is one.
  • 如果这是一个实际的实际考虑,顺便说一下,VirtualAllocEx 可以让您对分配进行更细粒度的控制,并且在new 失败的情况下可能会成功。
  • @zzxyz 但是您的代码不再可移植到其他平台 - 这是一种耻辱。
  • @JesperJuhl - 我已经开发了几个实际上需要分配大量内存(4-8GB)的应用程序,此时几乎需要一个操作系统抽象层(每个平台的特定代码)。在 1GB 时,可能还有另一个解决方案。

标签: c++ dynamic-memory-allocation


【解决方案1】:

与分配相关的一些开销,但这相当小 - 正如@zzxyz所说,您的问题可能是内存碎片。总共可能有大约 2GB 的可用内存,但可能没有 1GB 的连续可用内存(这是您明确要求的)。

您为其分配存储空间的任何对象都需要为其成员提供连续存储空间。 new[] 为对象的 连续数组 请求内存,因此整个存储块需要是连续的 - 这是 C++ 为您提供的保证,这可能非常有用。如果您使用 new 自己分配每个单独的对象,那么只有每个对象的存储需要是连续的,然后所有对象都可以分散在每个内存中它们自己的小连续块中。注意 new[]new

【讨论】:

  • 哦,new 需要连续分配是独一无二的还是一般是动态内存?
  • @Jimmy Joe - 您为其分配存储的任何对象都需要为其成员提供连续存储。 new[] 为连续的对象数组请求内存,因此整个存储块需要是连续的 - 这是 C++ 为您提供的保证,这可能非常有用。如果您使用 new 单独分配每个 individual 对象,那么只有每个对象的存储需要是连续的,然后所有对象都可以分散在内存中的每个小连续块中.注意 new[]new
  • 非常有趣,谢谢。我刚读完几段关于动态内存分配的文章,遗憾的是他们没有提到这个细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 2015-06-27
  • 2021-02-28
  • 2012-01-20
相关资源
最近更新 更多