在单个语句中将类类型分配给该类的取消引用指针时执行哪些操作

What operations are performed when a class type is assigned to a de-referenced pointer of that class, in a single statement?

本文关键字:指针 引用 取消 执行 操作 语句 单个 类型 分配      更新时间:2023-10-16

示例:

假设我们有一个 Node 类,其中包含所有这些复制 ctor、赋值运算符和默认 ctor 重载。

现在,当我们有以下赋值时,将以什么顺序调用哪些构造函数或运算符:

Node myNode = *(new Node());

new Node() - 创建一个新的动态分配的Node对象。生成指向新Node的指针。

* - 给定一个指针,产生它指向的东西(作为左值)。

Node myNode = - 创建一个新Node,它是一个局部变量,并将=右侧的任何内容传递给其构造函数。

总体效果:创建一个新的局部变量Node,创建一个动态分配的Node,并将动态变量复制到局部变量。此外,您无法销毁动态的,因此这会导致内存泄漏。

  1. Node '调用默认构造函数来构造匿名Node对象。
  2. Node 的复制构造函数被调用来复制初始化myNode
  3. 您泄漏了 1 Node 的内存,因为 new 返回的指针在语句结束时立即超出范围。 因此,您永远无法deletenew编辑的Node

不会调用Node::operator=,因为您正在执行使用复制构造函数的复制初始化。 像这样:

Node myNode;
myNode = Node();

将调用Node::operator=而不是复制构造函数,因为您将在构造myNode后分配给它。