2012-04-19 64 views
-5

可能重复:
Differences between dynamic memory and “ordinary” memory动态内存究竟是什么?

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

到现在为止,我们所有的程序,我们只有提供尽可能多的内存,我们宣布我们的变量,其源来确定它们的所有大小代码,在执行程序之前。

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

+0

http://stackoverflow.com/questions/3930013/stack-overflow-static-memory-vs-动态内存 – 2012-04-19 12:30:06

+0

http://stackoverflow.com/questions/2300191/dynamic-memory-allocation-question – 2012-04-19 12:30:21

+0

http://stackoverflow.com/questions/1699057/why-are-two-different-concepts-both-called-堆 – 2012-04-19 12:31:15

回答

5

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

不,这不是真实的,例如

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

但是,我似乎可以用动态内存时声明指针, 例如字符* P,为此,我还没有指定字符

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

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

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

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

希望这会有所帮助。

P.S.是的,有更有效的方法来获取未知数量的项目到内存中,但这是最简单的解释

2

事实上,我认为,当你使用一个指针,你总是使用动态内存。这不正确吗?

号下面是堆栈分配指针(“自动”)存储器:

{ 
    int i; 
    int *p = &i; 
} 
2

动态存储器是程序员必须明确地请求,作为一个反对对自动分配叠加。

有许多优点,以动态存储器,例如是堆栈帧之间持久的(函数调用),并且可以是不同大小的。

在堆的阵列多是具有一定规模的:

int ar[5]; 

但是如果10元件则无法做到这一点,该解决方案是动态分配的存储器;

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

也就是说动态分配的一切必须被释放(在C++中使用删除)

delete i_p; 

然而其通常为更好,其中可以使用包装器来动态数组如在std ::矢量

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

这将自动地管理存储器,并提供到阵列的有用的接口。

2

比方说,你想从用户读取数目不详的整数。你可以,例如,宣布int numbers[100],问他有多少数量有用户(让我们说这是可变n店),如果他进入大于100的数字,你将别无选择,但报告错误。或者,您可以编写int *numbers = new int[n]并为所有数字分配足够的空间。

3

当你有:

char* p; 

p是类型的指针变量为char和p被存储在堆栈上并且尚未分配的任何动态存储器。

但是,当你这样做:

您已经分配尺寸100 *的sizeof(char)的动态内存(堆)的一部分
p = new char[100]; 

你有责任以释放在堆上分配内存:

delete[] p; 

你并不需要清洗从堆栈变量 - 变量超出范围后,他们将被自动删除。在这个例子中,当p超出其范围时,它将从堆栈中移除。

2

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