编程语言书解释了值类型栈引用类型是在上面创建的堆上没有解释这两件事是什么。我还没有读清楚这个解释。我明白了堆栈是什么?但是,,,* i* m x2 Z+ S5 `: g 它们在哪里,它们是什么理上是真实计算机的内存)? 8 t8 p# H6 h8 v+ _" Q7 `它们在多大程度上受到操作系统或语言操作的控制? % K( d) c5 C2 a% D& e它们的范围是什么?9 R1 U7 b/ V9 k7 L4 A4 P
是什么决定了它们的大小? @9 J- B1 j' G. ^: E
是什么让一个更快? 8 Q% ]9 `( i, m) m( {. a$ \) w \解决方案: / o' L: R% y8 i: h 堆:* y) }1 _ x$ e3 U/ i) @ 像堆一样存储在计算机 RAM 中。/ d! k2 F" E' A
堆栈上创建的变量将超出范围并自动解除分配。 r7 g4 k* l7 m$ H/ n8 s/ F
分配比堆上的变量快得多。. m, A R& n8 p h( r w& G n
实现实际的堆栈数据结构。$ F3 Y: b+ ]" o
存储本地数据,返回地址,用于参数传输。8 g* b& O- ^6 l0 E) \( M# x4 v% V
堆栈溢出可能发生在使用过多的堆栈时(主要来自无限或过深的递归,分布非常大)。 4 A) x" T% k4 c6 v( P堆栈上创建的数据可以在没有指针的情况下使用。* l8 ~/ [. t3 b# [" @# Z/ ]
如果你确切知道编译前需要分配多少数据,而且不是太大,你会用堆栈。 / f8 A6 B# n9 K% I3 T7 G# C最大尺寸通常在您的程序启动时确定。堆:$ Y0 {# U; z0 x# B- u! P% E 电脑 像堆栈一样存储在计算机中RAM 中。 / u( e! V! \9 J! \- C, P n8 K在 C 中,堆放的变量必须手动销毁,永远不会超出范围。数据使用delete、delete[], 或释放free。 7 L) l" }7 G/ F% B3 ?3 B( ~与堆栈上的变量相比,分量。3 c! k9 Y' {6 E# _/ n" |/ i
用于程序按需分配数据块。% J9 P6 n$ y: L0 [
当有大量的分配和释放时,可能会有碎片。4 T2 L. F4 ~1 b4 p/ O
在 C 或 C 中,在堆上创建的数据将由指针指向并分别用new或分配malloc。 % ]5 z$ s. y+ H' b) F2 [. H如果要求分配的缓冲区太大,分配可能会失败。 [3 B3 ~% F3 h7 [- A
如果您不确切地知道运行中需要多少数据或需要分配大量数据,则可以使用堆。2 z- q2 \4 H' b( A3 n
负责内存泄漏。例子: 4 f) b2 p. m4 z. B
int foo(){ char *pBuffer; //<--nothing allocated yet (excluding the pointer itself,which is allocated here on the stack). bool b = true; // Allocated on the stack. if(b) { Create 500 bytes on the stack char buffer[500]Create 500 bytes on the heap pBuffer = new char[500]<-- buffer is deallocated here,pBuffer is not}//<--- oops there's a memory leak,I should have called delete[] pBuffer;8 R# u# t( m( R( I: l