使用构造函数Vs动态初始化对象。 c ++中的新内容?

时间:2014-03-05 14:22:04

标签: c++ object memory-management dynamic

关于对象的动态内存初始化,这两个语句之间有什么区别: -

  

class_name * obj = new class_name;

     

class_name obj = class_name();

5 个答案:

答案 0 :(得分:3)

第一个例子大致如下:

  • 调用operator new并在堆上分配内存
  • 调用class_name的默认构造函数,因此初始化指向的对象。

第二个例子:

  • 创建临时对象A(分配的右侧)。
  • 创建对象B(默认构造函数;左侧)
  • A的内容被对象B的内容覆盖 - 这是通过调用赋值运算符
  • 完成的
  • A被摧毁。

编辑:实际上,我为上面第二个例子所写的内容并不正确(也许它也没错)。我不知道这里的标准,但是使用VC12(优化关闭)代码不会创建临时对象。它只是调用堆栈上对象的默认构造函数。如果有一个私有赋值运算符,代码就不会编译 - 正如James在他的评论中所写的那样。

答案 1 :(得分:2)

第一个动态定义指向class_name的指针 分配该类型的对象,并初始化指针 以其地址。对象本身的生命周期是 你明确删除它。如果class_name有默认值 构造函数,被称为;否则,对象不是 初始化。

第二个定义class_name的实例;它正式地说 使用默认值构造该类型的临时文件 如果定义了一个构造函数,或者如果没有则构造函数为零, 和copy从中构造定义的实例。该 但是,允许编译器忽略此复制结构 (以及我所知道的所有事情),并构造定义的对象 直。 (它仍然必须验证是否存在可访问性 但是,复制构造函数。)已定义对象的生命周期 直到它超出范围。

一般来说,除非我们确实需要,否则我们会避开第一种形式 显性寿命。

答案 2 :(得分:1)

首先是动态分配。第二个是静态分配,但值已初始化。

答案 3 :(得分:1)

此:

class_name *obj = new class_name;

在堆上创建一个对象,您需要通过delete删除它以避免内存泄漏。

此:

class_name obj = class_name();

在堆栈上创建一个对象,当该对象超出范围时将被删除。

答案 4 :(得分:1)

希望您正确地关联了作业/问题文本。这很微妙。 “动态”与第一个语句中的动态分配无关。

()括号确保C ++ 03 值初始化,对于POD类型,这意味着归零。没有它(第一个语句),如果类是POD,则其成员不需要初始化。我必须检查更一般情况的标准,但我认为,既然你知道问题是什么,那就是你可以自己做的事情。