让我们考虑一下这段代码:
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的断言。
发布于 2019-02-21 18:08:11
这是明确依赖于实现的。顺便说一句,仅仅是堆栈和堆的概念在标准中是不存在的,即使它们在现实世界的实现中很常见。
我记得很好的旧的MS/DOS系统,它的分配类型可以依赖于memory model。一些编译器在小型和中型模型中对堆栈和堆都使用了一个单段(SS),堆栈从一端增长,堆从另一端增长,但对于紧凑和大型模型,则使用程序上方的内存分配(因此独立于堆栈)。
在前一种情况下,如果堆栈分配是不可能的,堆分配也是不可能的,但在后一种情况下,堆和堆栈分配可以独立地成功或失败。
在使用virtual memory的现代操作系统中,通常会有一个固定大小的堆栈,并要求操作系统为堆提供新的空闲块。在这种情况下,堆栈和堆分配可以独立地成功或失败
https://stackoverflow.com/questions/54803206
复制相似问题