gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:51:25 25 4
gpt4 key购买 nike

让我们考虑这段代码:

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分配内存的时刻没有可用空间,同时堆栈中有足够的可用空间。

我的问题很简单:将在栈中分配给msg_buffer如果为 buffer 分配总是错误的在堆中是错误的?

据我所知,堆栈是为每个线程分配的,堆是为进程分配的。那么,是否可以保证堆栈中的内存分配结果与堆中的内存分配结果无关?当然,我不考虑堆栈溢出本身。换句话说,为堆栈预留的内存是否真的为它预留了全部?还是在某些情况下,在程序执行期间由于某种原因可以缩小此保留?

如果没有关于此的独立于平台的断言,那么我可以知道是否有针对 x86 架构的 Linux 的情况。

最佳答案

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

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

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

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

关于c++ - 堆中分配的结果是否与堆栈中分配的结果相互依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54803206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com