我无法理解为什么通过new
分配的堆栈中的内存只能通过指针访问,而堆中的内存(静态分配)可以正常访问。
它是否与堆中几乎所有内存都有某种顺序并且堆栈中的内存有些随机的事实有关? (如果我刚才所说的是真的。)
动态记忆对我来说似乎很模糊和神秘,所以任何能够帮助我更好地理解它的人都会非常感激。
答案 0 :(得分:5)
为什么运算符“new”需要指针才能工作?
因为它在heap
上分配了一块内存(大小由调用者指定),并返回该分配块开头的address
。
我们为什么要使用它
如果我们想要暂时使用该内存,我们就会使用它,因此我们可以轻松delete[]
。
您可以轻松更改已分配内存的大小(调整大小)。
char arr[20]; // You need more space? Not possible to change size
// While
char * arr = new char[20];
delete[] arr;
arr = new char[50];
缺点
使用new
分配对象要贵得多。
速度较慢。
内存泄漏
内存碎片
必须免费delete[]
<强>摘要强>
Stack
(automatic storage
)更易于使用,更快捷。万无一失。但有时我们必须使用heap
,我们应该尽可能小心。
答案 1 :(得分:0)
请参阅,在C ++中,内存分为四个部分,即
现在,正如名称定义程序代码部分存储代码和全局变量部分存储全局变量。 这两部分非常清楚。
现在,我们关注的是堆栈内存和堆内存。
堆栈内存保留用于静态实现。
堆内存保留用于动态实施。
堆栈内存中的变量在编译期间分配。 但是堆内存中的变量是在运行时分配的,因为它在运行时分配,我们无法将其作为普通变量处理。
这里我们需要指针,因为我们需要一些东西将我们引用到动态分配期间获得的内存。这项工作是由指针完成的。