【问题标题】:Point of objects vs dynamically created objects? [closed]对象点与动态创建的对象? [关闭]
【发布时间】:2014-01-17 09:21:45
【问题描述】:

我刚从我朋友的采访中听到这个消息。有人问他动态创建对象和定期创建对象的区别和要点是什么。

例子:

Obj *test = new test();

Obj test;

动态创建对象与创建对象的区别和意义何在?我知道一个区别可能是动态创建的变量在堆上,而另一个在堆栈上,但还有更大的区别吗?

【问题讨论】:

  • 首先你可以释放动态创建的。
  • new test();// on heapObj test; //on stack
  • 为什么人们会因为“太宽泛”而关闭它。一点都不宽泛。当然,这是一个糟糕的问题——因为 OP 没有尝试研究这个问题。但它不是“太宽泛”。
  • Stroustroup 刚刚哭了。对不起。至少阅读一本关于 C/C++ 的书。甚至是互联网上的一篇初学者 C/C++ 文章。 @Moo-Juice 我一直认为 stackoverflow 的存在是为了帮助人们,而不是为人们做任何事情。这个问题可以通过阅读书籍/互联网文章来回答。它不应该在这里。这不是全球性问题,也不是特殊情况。我想,我们在这里所能提供的只是建议一些好书来阅读。
  • 我不同意到目前为止所有的票数。如果有人能找到重复的问题(我只能找到 similar 问题),可以为此关闭它,但这个问题既不太宽泛也不太离题。

标签: c++ object pointers dynamic


【解决方案1】:

C++ 没有堆和栈的概念。相反,这两种不同类型的分配是关于存储持续时间

  • 当您使用块本地声明创建对象时,它具有自动 存储持续时间。这样的对象会在超出范围时被销毁。

  • 当您使用new 创建对象时,它具有动态 存储持续时间。当您手动delete 它时,这样的对象将被销毁。作为程序员,您有责任确保对象被销毁。

您应该始终尽可能使用自动存储期限。当您需要一个对象在不同范围之间保持活动时,您只需要动态存储持续时间。如果您确实需要动态存储持续时间,您应该更喜欢使用智能指针(如std::unique_ptrstd::shared_ptr),它为您管理动态分配对象的生命周期。这将帮助您避免内存泄漏。

【讨论】:

  • 任何对 C++ 的引用都没有堆和栈的概念
  • @Pilot new 不一定在内部调用 malloc。标准只是说它应该做什么,而不是它应该怎么做。是否调用malloc 是一个实现细节。尽管如此,定义malloc 的C 标准也绝对没有提到堆。所以不,malloc() != heap
  • @Pilot:你为什么要编造一些东西,并把它当作事实?还是您只是在重复您从可疑来源听到的内容?
  • @Pilot,new 不会在内部调用 mallocnew一些 实现 - 即,不包括放置新、一些自定义(客户端定义)实现等 - 可能 在内部调用 malloc,具体取决于什么图书馆实施者决定。但是,该标准绝不是强制要求的。
  • @Pilot 那是operator new的实现。我从来没有说过它不能使用malloc,只是它不一定必须。该标准不要求它。如果是这样,它不会改变malloc 也没有任何堆概念的事实。它只是分配内存。
【解决方案2】:

主要区别在于对象的生命周期:堆栈对象是自动控制的,而堆对象是手动控制的。所有其他差异都是此差异的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多