【问题标题】:Object Construction Syntax [duplicate]对象构造语法 [重复]
【发布时间】:2012-12-05 14:51:12
【问题描述】:

可能重复:
What is difference between instantiating an object using new vs. without
Creating an object: with or without `new`

这两种说法有什么区别

 HttpUtil httpUtil;

 HttpUtil *net = new HttpUtil();

哪个更好用?

【问题讨论】:

  • 第一个分配在堆栈上,另一个在堆上,使用后释放它是程序员的责任(当它分配在堆上时)。如果没有第二个,你可以选择第一个:)
  • 请从here获取一本初学者书籍。

标签: c++ oop


【解决方案1】:

第一个创建一个自动变量。内存管理是自动的,分配更快,因为它在堆栈上,没有内存泄漏的机会。

第二个版本创建一个动态变量——你负责清理内存,堆上的分配速度较慢。

总是喜欢第一个。如果您必须使用动态分配(用于持续生命周期或多态行为),请使用智能指针而不是原始指针。

【讨论】:

  • 所以我可以访问*net,即使我实例化它的函数完成了??
  • @kalkin 取决于你如何返回它。
  • 我是否将它作为指针返回?
  • 如果返回一个指针,即return &httpUtil,那就错了。如果你通过引用返回,那就错了。只需按值返回。
【解决方案2】:

第一条语句在“堆栈”上创建了一个名为 httpUtil 的变量 - 这意味着,一旦包含该行的函数完成,该变量就会“超出范围”并被释放(它使用的内存变为免费用于其他东西)。

第二条语句在“堆”上创建一个变量——这意味着该变量将保留在内存中,直到您对其调用delete。在堆上分配变量时,您需要确保在某些时候始终 delete 它,否则您会出现内存泄漏 - 这是您无法再看到 *net 变量的地方,但内存仍然被分配.

【讨论】:

    【解决方案3】:

    第一个是静态创建的对象,您无需担心它的破坏。 稍后一个是动态创建的对象,您需要在应用程序终止之前处理它的销毁。

    在您不需要担心内存管理的情况下,首选第一个。

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 2016-07-08
      • 2011-04-30
      • 2015-12-01
      • 1970-01-01
      • 2012-12-22
      • 2014-07-05
      • 2019-04-14
      • 2020-12-14
      相关资源
      最近更新 更多