【问题标题】:What does the 'new' keyword do in c++? [duplicate]'new' 关键字在 C++ 中的作用是什么? [复制]
【发布时间】:2011-08-17 06:52:13
【问题描述】:

可能的重复:
When to use “new” and when not to, in C++?
When should I use the new keyword in C++?

A a;A a = new A(); 有什么区别?

已编辑

A* a = new A();

我的错。

【问题讨论】:

  • 我们需要A的定义。如果A 没有默认构造函数,应该怎么解释?两者都是无效的,并且标记任何差异都没有意义。如果 A 有一个 ctor 采用 A* 和一个默认 ctor,或者如果 Avoid*,则两者都是有效的。我们无法全面详细地了解语义。这就是书籍的用途。
  • @Johannes:你很迂腐。您必须尝试与提问者会面。很多关于 SO 的问题都可以回答,“我不知道会发生什么,这取决于你没有向我们展示的许多因素,”但这没有帮助。您可以做出合理的假设。
  • @Ned pedantry 是编程的全部内容。
  • @Ned 我学会了认真对待问题并停止做出假设。对于那些不像你那样理解语言的人来说,你所做的假设不一定是显而易见的。如果有人不知道这方面的语言并搜索谷歌,他/她可能会逐字阅读这个问题。
  • @Johannes:所以您以牺牲 OP 为代价为未来的搜索者优化了答案?很奇怪。同时,您首先假设 A 是已定义的类。如果 A 是一个宏,那么这段代码绝对可以做任何事情!如果这段代码是按字面意思提供给 C++ 编译器的,它会抱怨 A 是未定义的。如果你对问题不那么认真,你会帮助更多的人。

标签: c++ memory-management syntax


【解决方案1】:

在函数内部时,

A a

在堆栈上声明一个变量并在 a 上调​​用 A 的默认构造函数*。当变量超出范围时,该变量会自动清理。

A a = new A(); 

但是不会编译

A* a = new A(); 

在堆上创建一个新的 A 并在新分配的内存上调用 A 的默认构造函数*。然后表达式反过来计算一个指向新 A 的指针,变量 a 被初始化为 。您负责管理此内存,因此您需要确保稍后使用 delete 将其删除:

delete a;

否则你会得到一个memory leak

请参阅此question 以了解有关堆栈和堆之间差异的更多信息。

* 如果 A 没有默认构造函数,则这些代码都不会编译。默认构造函数要么由您定义,要么由编译器隐式提供。有关默认构造函数的更多信息,请参阅here

【讨论】:

    【解决方案2】:

    道格·T:

    A a 在堆栈上声明了一个变量。

    不正确:A a 声明了一个变量并为其分配了内存,无论是在堆栈上还是在全局内存空间中,这取决于它的作用域。

    还要考虑内存的位置

    static A a
    

    位于(全局内存空间 - 不是堆栈,不是堆)。

    【讨论】:

      【解决方案3】:

      第二个无效。 new 分配空间并返回一个指针。使用 A* a = new A();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-16
        • 1970-01-01
        • 2019-11-24
        • 2010-12-11
        • 2012-03-01
        相关资源
        最近更新 更多