C++ 什么是动态记忆?

C++ 什么是动态记忆?,c++,C++,可能重复: 我正在阅读C++教程,我不明白为什么我需要声明动态内存,这就是教程所说的: 到目前为止,在我们所有的程序中,我们只有和我们为变量声明的一样多的可用内存,在程序执行之前,所有变量的大小都要在源代码中确定 然后它说我们必须使用new和delete操作符来使用动态内存。 但是,我在声明指针时似乎使用了动态内存,例如char*p,我没有为其指定字符数组的长度。事实上,我认为当你使用指针时,你总是在使用动态内存。这不是真的吗? 我只是看不到使用new运算符声明变量和不使用new运算符声明变量

可能重复:

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

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

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

事实上,我认为当你使用指针时,你总是在使用动态内存。这不是真的吗

不是。这里有一个指向堆栈分配(“自动”)内存的指针:


动态内存是程序员必须明确请求的内存,作为对堆栈自动分配的一种反对

动态内存有许多优点,例如在堆栈帧(函数调用)之间保持持久性,并且可以具有不同的大小

在堆栈上,数组必须具有一定的大小:

int ar[5];
然而,如果您需要10个元素,那么您就不能这样做,解决方案是动态分配内存

size_t sz;
std::cin >> sz;
int *i_p=new int[sz];

表示所有动态分配的都必须被释放(C++中使用删除)< /P> 但是,在可能的情况下,最好对动态数组(如std::vector)使用包装器

size_t sz;
std::cin >> sz;
std::vector<int> vect(sz);
size_t sz;
标准:cin>>sz;
std::vector-vect(sz);

这将自动管理内存并为阵列提供有用的接口。

假设您想从用户处读取未知数量的整数。例如,您可以声明
int numbers[100]
,询问用户有多少个数字(假设这是存储在变量
n
中),如果他输入的数字大于100,您将别无选择,只能报告错误。或者,您可以编写
int*numbers=newint[n]
,并为所有数字分配足够的空间。

如果您有:

char* p;
p是指向char的指针类型的变量,p存储在堆栈上,您没有分配任何动态内存

但当你这样做的时候:

p = new char[100];
您已经分配了大小为100*sizeof(char)的部分动态内存(heap)

您负责释放堆上分配的内存:

delete[] p;

您不需要从堆栈中清除变量——它们将在变量超出范围后自动删除。在本例中,
p
超出其范围时将从堆栈中删除

> C++中的动态内存是使用新的操作符在操作系统堆中分配的内存。当您需要分配太大且无法在堆栈中分配的对象时,或者当您有多线程环境且需要在不同线程之间共享在其中一个线程中分配的内存时,您需要动态内存。指针并不意味着您使用的动态内存指针还可以包含与堆栈中的对象相关的堆栈地址

我认为当你使用指针时,你总是使用动态的 记忆力这不是真的吗

不,比如说,这不是真的

int i;
int *p = &i; // uses a pointer to static memory, no dynamic memory.
但是,我在声明指针时似乎使用了动态内存, e、 g.char*p,我没有为其指定数组的长度 人物

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

假设您必须从文件中读取一些int并将其存储在内存中。你不知道你需要多少整数。你可以选择100,但是如果有101,你的程序就会中断。你可以选择100000,希望这就足够了,但是如果文件中只有10个,那就是浪费资源,而且如果文件中有100001个整数,它就会崩溃

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

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

希望这有帮助

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

delete[] p;
int i;
int *p = &i; // uses a pointer to static memory, no dynamic memory.
char[100] string;
char* p = &(string[0]);  // Same as above, no dynamic memory.