堆中的分配结果是否与堆栈中的分配结果相互依赖?

问题描述 投票:1回答:1

我们考虑一下这段代码:

static const size_t DATA_SIZE = 100000;

void log_msg(const char* msg)
{
  char msg_buffer[DATA_SIZE];
  // Do something...
}

int main()
{
  // Do something heap-memory consuming...

  unsigned char buffer = new unsigned char[DATA_SIZE];
  if(!buffer)
  {
    log_msg("Insufficient memory!");
    return 1;
  }

  // Go ahead...

  delete[] buffer;

  return 0;
}

现在,让我们想象一下,在buffer的堆中分配内存时,没有可用空间AND,同时堆栈中有足够的可用空间。

我的问题非常简单:如果在堆中msg_buffer的分配是错误的,那么在buffer的堆栈中分配是否总是错误的?

据我所知,堆栈是为每个线程和堆分配的 - 用于进程。那么,是否有任何保证,堆栈中的内存分配结果与堆中的内存分配结果无关?当然,我不认为堆栈溢出本身。换句话说,为堆栈保留的内存实际上是为它完全保留的吗?或者在程序执行期间出于某种原因可能会出现这种情况?

如果没有关于此的平台无关断言,那么我可以知道Linux for x86架构是否存在。

c++ memory-management
1个回答
1
投票

这明确依赖于实现。顺便说一下,即使它们在现实世界的实现中很常见,标准中也不存在堆栈和堆的概念。

我记得很好的旧MS / DOS系统,分配类型可能依赖于memory model。一些编译器在堆栈和堆的小型和中型模型中使用一个单独的段(SS),堆栈从一端生长,堆从另一端生长,但是使用从程序上方的内存中分配(因此独立于堆栈)适用于紧凑型和大型型号。

在前一种情况下,如果堆栈分配不可能,堆分配也不是,但在后一堆和堆栈分配可能成功或独立失败。

在使用像Linux这样的virtual memory的现代操作系统中,通常有一个固定大小的堆栈,并要求操作系统为堆提供新的空闲块。在这种情况下,堆栈和堆分配可以独立成功或失败

© www.soinside.com 2019 - 2024. All rights reserved.