什么是动态内存?

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

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

直到现在,在我们所有的程序中,我们只有尽可能多的内存可用,就像我们为变量声明的一样,在执行程序之前,它们的大小都在源代码中确定。

然后它说我们必须使用新的和删除操作符来使用动态内存。 但是,我似乎在声明一个指针时使用动态内存,例如char * p,我没有指定字符数组的长度。 事实上,我认为当你使用指针时,你总是使用动态内存。 这不正确吗? 我只是没有看到使用new运算符声明变量而不是之间的区别。 我真的不明白什么是动态内存。 任何人都可以解释我吗?


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

不,这不是真的,例如

int i;
int *p = &i; // uses a pointer to static memory, no dynamic memory.

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

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

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

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

在这种情况下,您的程序可以迭代文件,计算整数,然后动态创建正确大小的数组。 然后,您再次将文件读入您​​的新阵列中。

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

希望这可以帮助。

PS是的,有更有效的方法可以将未知数量的物品存入记忆中,但这是最简单的解释


当你有:

char* p;

p是指向char的类型指针的变量,p存储在堆栈中,并且没有分配任何动态内存。

但是当你这样做时:

p = new char[100];

您已分配大小为100 * sizeof(char)的动态内存(堆)的一部分。

您有责任释放堆中分配的内存:

delete[] p;

您不需要清除堆栈中的变量 - 变量超出范围后,它们将自动移除。 在这个例子中,当p超出范围时,它将从堆栈中移除。


动态内存是程序员必须明确要求的内存,作为反对在堆栈上自动分配的内存。

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

在堆栈上,一个数组的大小是一定的:

int ar[5];

但是,如果你的元素是10个,那么你不能这样做,解决方案是动态分配内存;

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

这表示动态分配的所有内容都必须被释放(在C ++中使用delete)

delete i_p;

但是,如果可能的话,使用包装器来动态数组(如std :: vector)通常会更好

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

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

链接地址: http://www.djcxy.com/p/82835.html

上一篇: What exactly is dynamic memory?

下一篇: How is an object stored in heap?