【问题标题】:Why does operator "new" require a pointer to work?为什么操作符“new”需要一个指针才能工作?
【发布时间】:2017-08-10 11:52:57
【问题描述】:

我无法理解为什么通过new 分配的堆栈中的内存只能通过指针访问,而堆中的内存(静态分配)可以正常访问。

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

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

【问题讨论】:

  • 您似乎对这里的术语感到困惑。您确实应该发布一个您发现不清楚的 code 示例。这样人们就可以向你解释了。
  • 这就是new操作符所做的:为你分配一个新对象的内存并创建一个指向它的指针
  • 是什么让它看起来“神秘”?这是一个完全确定的和基于规则的过程,即使它的内部运作并不明显。
  • 我很确定您已经混淆了堆栈(具有自动生命周期的变量的存储)和堆(具有动态生命周期的变量的存储,通常由new 分配)。
  • @DanailNedkov new 返回一个指针,因此您不能直接将其分配给int。但是,您可以使用 int &i = *new int; ——但这会特别不习惯。

标签: c++ pointers new-operator dynamic-memory-allocation


【解决方案1】:

为什么操作符“new”需要一个指针才能工作?

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

我们为什么要使用它

  • 如果我们想要临时内存,我们会使用它,所以我们可以轻松地delete[]它。

  • 您可以轻松更改分配内存的大小(resize)。

    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,我们应该尽可能小心。

【讨论】:

    【解决方案2】:

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

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

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

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

    堆栈内存是为静态实现保留的

    堆内存是为动态实现保留的

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

    这里我们需要指针,因为我们需要一些东西来将我们指向在动态分配期间获得的内存。这项工作是由指针完成的。

    【讨论】:

    • 感谢您的贡献。从技术上讲,C++ 没有堆栈“存储”和堆“存储”,它具有(我认为)动态存储和自动存储。另一方面,堆栈和堆可能被更多地提及。
    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2017-08-14
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多