什么是动态内存?
可能重复:
动态内存和“普通”内存之间的差异
我正在阅读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