【问题标题】:Why do I need to call new? [duplicate]为什么我需要调用新的? [复制]
【发布时间】:2011-02-12 20:22:41
【问题描述】:

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

似乎我可以在不使用单词new 的情况下编写一些东西,而且我也不必担心删除任何东西,那我为什么要调用它呢?

据我了解,这是因为我会用完堆栈内存。

这是正确的吗?我想我的主要问题是,我应该什么时候打电话给new

【问题讨论】:

标签: c++ new-operator


【解决方案1】:

这是一个对象生命周期的问题:如果你堆栈分配你的对象,当这些对象超出范围时(例如,在方法结束时),对象的析构函数将被调用。这意味着,如果您将这些对象从创建它们的方法中传递出去,您会发现自己的内存指针随时可能被覆盖。

【讨论】:

    【解决方案2】:

    这是因为你可能在编译时不知道你是否需要一个对象,或者有多少,或者什么类型。 new 运算符允许您动态分配对象,而无需事先知道这些事情。

    这是一个事先不知道对象类型的例子:

    class Account { ... };
    class CheckingAccount : public Account { ... };
    class VisaAccount : public Account { ... };
    
    ...
    
    Account *acct = type == "checking" ? new CheckingAccount : new VisaAccount;
    

    【讨论】:

    • 它不允许您生成在运行时确定的类型的对象。必须事先知道类型。至于“多少”,也可以使用标准容器。
    • @sellibitze,acct 变量在运行时指向什么类型的对象?您认为标准容器如何为其元素分配内存?
    【解决方案3】:

    您需要使用 new/delete 的主要原因是手动控制对象的生命周期。

    其他原因已经由其他人提供,但我认为这是更重要的。使用堆栈,您可以清楚地知道对象的生命周期。但是如果你想让一个对象只有在事件发生后才被销毁,那么它就不能被自动定义。

    【讨论】:

      【解决方案4】:

      在堆栈上创建的数据/对象的生命周期仅限于块。您不能返回指向它的引用/指针。对于跨函数可用的数据,您可以使用new 在堆上创建它。当然,它可以是更高层次的,甚至是全球性的。但是您很少在编译时知道运行时需要多少数据/多少对象。

      【讨论】:

        【解决方案5】:

        您可以编写许多重要的程序,而无需调用“new”。 (或因此删除)。

        您无法做的(至少在不编写或使用自己的等价物的情况下)是决定在运行时创建什么类型的对象或要创建的对象数量,因此您将受到限制。

        【讨论】:

          【解决方案6】:

          [更新]

          您可以使用 new 来创建某个类的新实例,或分配内存(例如数组),例如

          对象 o = new Object();

          在创建类 Object 的新实例之前,您不能使用它。 (除非您有静态方法。)(这只是一个使用示例,有时其他对象会实例化或销毁您需要/不需要的对象)

          这里有很多很好的答案,但是很难在一个关于 SO 的回复中解释关于 new 的所有内容,如果你不明白调用 new 时会发生什么,那么很难知道何时使用它。这是编程中最重要的领域之一,因此,在阅读了这里的基本信息之后,您应该更详细地研究它。以下是您可以开始研究的可能文章之一:

          http://en.wikipedia.org/wiki/New_%28C%2B%2B%29

          您必须学习的主题才能了解调用 new 时会发生什么,以便您了解何时调用它(可能还有更多,但这是我现在能想到的): - 构造函数(和析构函数) - 静态类和方法 ...

          【讨论】:

          • 如果解释太长,为什么还要在这里写呢?
          • 嗨 Keith,感谢您的评论,但请评论我的回答,而不是您对它的解释。如果您仔细阅读我的回答,您会注意到我从未说过您必须使用 NEW 并且只能使用 NEW 来创建类的实例。只有那个 NEW 用于创建类的新实例,这是真的。在实例化之前不能使用一个类也是事实,除非有一些静态的东西(我也提到过),但后来我意识到关于这个重要的主题有很多话要说,我能做到的最好指向更好的来源(Artem 的答案)。
          • @zarko-o 其实你说的是“你需要 new 来创建某个类的新实例”,这是不正确的。
          • @meagar 我总是想学习新事物。您能否解释一下其中有什么问题,这可能有助于我增加理解。
          • @zarko-o 问题是您可以在没有 new 的情况下创建对象实例,您不需要 它就是您打开答案的方式。
          猜你喜欢
          • 1970-01-01
          • 2017-11-27
          • 2021-02-23
          • 2012-03-16
          • 1970-01-01
          • 2015-08-27
          • 1970-01-01
          • 2020-09-26
          • 1970-01-01
          相关资源
          最近更新 更多