什么是动态记忆?

cra*_*acq -4 c++

可能重复:
动态内存和"普通"内存之间的差异

我正在阅读C++教程,我不明白为什么我需要声明动态内存,这就是教程所说的:

到目前为止,在我们所有的程序中,我们只有我们为变量声明的可用内存,在程序执行之前,所有变量的大小都要在源代码中确定.

然后它说我们必须使用new和delete运算符来使用动态内存.但是,我似乎在声明一个指针时使用动态内存,例如char*p,我没有指定字符数组的长度.事实上,我认为当你使用指针时,你总是使用动态内存.不是吗?我只是没有看到使用new运算符声明变量之间的区别.我真的不明白动态内存是什么.谁能解释一下这个?

Bin*_*ier 5

我认为当你使用指针时,你总是使用动态内存.不是吗?

例如,不,这不是真的

int i;
int *p = &i; // uses a pointer to static memory, no dynamic memory.
Run Code Online (Sandbox Code Playgroud)

但是,我似乎在声明一个指针时使用动态内存,例如char*p,我没有指定字符数组的长度

char[100] string;
char* p = &(string[0]);  // Same as above, no dynamic memory.
Run Code Online (Sandbox Code Playgroud)

当您无法确定数据结构需要多大时,您需要动态内存.

假设你要从文件中读取一些int并将它们存储在内存中.你不知道你需要多少in.你可以选择一个100的数字,但如果有101则你的程序会中断.你可以选择100,000希望这已经足够了,但是如果文件中只有10个则浪费资源,而且如果有100,001个整数就会中断文件.

在这种情况下,您的程序可以遍历文件,计算整数,然后动态创建一个正确大小的数组.然后你第二次将文件读入你的新数组中.

静态v的动态内存
静态内存是静态的,因为一旦程序被编译就无法更改,它是静态的.您在函数中声明的变量,在类/结构上声明的成员是静态的.编译器会精确计算每个方法调用时需要的每个方法的数量.
动态内存是内存的"池",可以在运行时根据需要提供给您的程序.编译器只知道它需要分配一些(可能是未知的)内存量,并将该内存释放回动态内存池.

希望这可以帮助.

PS是的,有更有效的方法可以将未知数量的项目存入内存,但这是最简单的解释