C++ 对C+动态内存分配的确切含义有点困惑+;
关于动态的确切含义,我听到过一些相互矛盾的事情,就这一点而言,是自动的,内存分配。我听说堆栈被称为自动内存分配和动态内存分配。我可以看到这两种情况,因为堆栈内存块大小是在程序执行之前确定的,所以它的最大大小在运行时不能增长。然而,在程序执行期间,随着函数数据被推送到堆栈上或从堆栈上弹出,堆栈会不断增长和收缩 从这个意义上说,这不是动态内存分配吗 如果是这样的话,那么仅仅将堆称为动态堆不是很混乱吗 有人能帮我澄清一下吗 编辑:在撰写本文时,我似乎混淆了一些我不知道的概念。在C++中,堆栈的低级字节集和堆内存管理和相同的事物的高级概念之间有区别。关于这一点的澄清,请参考我下面接受的答案。根据: 动态内存分配是指执行手动内存分配 管理层 从这个意义上讲,堆栈不是动态的,因为在编译时必须知道堆栈变量的大小: C编程语言静态地管理内存,自动地管理内存, 或者动态地静态持续时间变量在主 内存,通常与程序的可执行代码一起,以及 在程序的生命周期内保持自动持续时间变量 在堆栈上分配,并在调用函数和 返回。对于静态持续时间和自动持续时间变量,大小 分配的类型必须是编译时常量。[…]分配内存的生存期也会引起关注。[…]通过使用动态内存分配可以避免这些限制 实际上,即使在堆栈上,也可以通过以下几种方式动态分配内存:C++ 对C+动态内存分配的确切含义有点困惑+;,c++,memory,memory-management,stack,C++,Memory,Memory Management,Stack,关于动态的确切含义,我听到过一些相互矛盾的事情,就这一点而言,是自动的,内存分配。我听说堆栈被称为自动内存分配和动态内存分配。我可以看到这两种情况,因为堆栈内存块大小是在程序执行之前确定的,所以它的最大大小在运行时不能增长。然而,在程序执行期间,随着函数数据被推送到堆栈上或从堆栈上弹出,堆栈会不断增长和收缩 从这个意义上说,这不是动态内存分配吗 如果是这样的话,那么仅仅将堆称为动态堆不是很混乱吗 有人能帮我澄清一下吗 编辑:在撰写本文时,我似乎混淆了一些我不知道的概念。在C++中,堆栈的低级字节
alloca()
函数李>
你的第二个困惑是关于堆栈的增长。是的,堆栈的最大大小是静态确定的。但是,最大大小远大于正常程序所需的大小(Linux上默认为8MB),甚至可以在运行时通过使用操作系统API(Linux上的
setrlimit
)更改该数字。在程序执行期间,堆栈的实际大小会动态地增长和收缩,直到达到此限制。我将尽可能地消除混淆。首先,学习将低级内存模型概念(堆栈、堆)与c++级内存概念分开。在C++世界中,<代码>堆栈和void foo() {
int a;
}
int var1;
void foo() {
static int var2;
}
class A {
static int var3;
}
void foo() {
int* var4;
// Here is the major source of confusion. var4 itself is **automatic**
// you do not need to allocate or free var4 memory, so you can use it
// like this:
var4 = NULL; // Not an error!!!
// However, you can't use the memory var4 points to yet!
// Following line would cause incorrect behavior of the program:
// *var4 = 42; // NEVER EVER!!!
// Instead, you need to allocate the memory first (let's assume, we are in C++
var4 = new int();
// Now the memory was allocated, we can use it
*var4 = 42; // Correct!
// we no longer need this memory, so let's free it:
delete var4;
// This did not change var4 itself (unless there is a special case)
// so technically, it still points to the memory which was former
// belonging to you. But the memory is no longer yours!!!
// you can't read or write it!
// Following code is bad-bad-bad:
// int x = *var4; // NEVER EVER!
}