为什么 operator "new" 需要一个指针才能工作?

Why does operator "new" require a pointer to work?

想不通为什么new分配的栈内存只能通过指针访问,而堆内存(静态分配)可以正常访问。

这是否与堆中的几乎所有内存都具有某种顺序而堆栈中的内存有点随机这一事实有关? (如果我刚才说的是真的的话。)

动态记忆对我来说是如此的模糊和神秘,所以任何能帮助我更好地理解它的人都将不胜感激。

Why does operator “new” require a pointer to work?

因为它在分配块开头的 heap 和 returns address 上分配内存块(大小由调用者指定)。

Why are we using it

  • 如果我们想要临时内存,我们会使用它,所以我们可以轻松地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];
    

Disadvantage

  • 使用 new 分配对象要昂贵得多。

  • 比较慢

  • 内存泄漏

  • 内存碎片

  • 必须免费delete[]

总结

Stack (automatic storage) 更易于使用、更快且万无一失。但是有时候我们不得不使用heap,还是要尽量小心。

看,在C++中,内存分为四个部分,即

  1. 程序代码
  2. 全局变量
  3. 堆栈

现在,正如名称所定义的那样程序代码部分存储您的代码并且全局变量部分存储全局变量。 这两部分已经很清楚了。

现在,我们关心的是栈内存堆内存

堆栈内存保留用于静态实现

堆内存保留用于动态实现

堆栈内存中的变量是在编译期间分配的。 但是堆内存中的变量是在运行时分配的,因为它是在运行时分配的,我们不能把它当作普通变量来处理。

Here we require pointers because we need something that refers us to the memory accquired during dynamic allocation. This job is done by pointers.