课程的一些细节已被删除。特别是,构造函数动态分配DataStructure
对象,而析构函数释放它。如果在移动过程中,您只是将指针从一个复制Widget
到另一个,则两个Widget
s 都将具有指向同一个分配DataStructure
对象的指针。然后,当这些对象被销毁时,它们都会尝试这样delete
做。这将给出未定义的行为。为避免这种情况,Widget
正在移动的 将其内部指针设置为nullptr
。
这是实现移动构造函数时的标准模式。您希望将一些动态分配的对象的所有权从一个对象转移到另一个对象,因此您需要确保原始对象不再拥有这些分配的对象。
从图表上看,您从这种情况开始,希望将所有权DataStructure
从一个Widget
转移到另一个:
┌────────┐ ┌────────┐
│ Widget │ │ Widget │
└───╂────┘ └────────┘
┃
▼
┌───────────────┐
│ DataStructure │
└───────────────┘
如果您只是复制指针,您将拥有:
┌────────┐ ┌────────┐
│ Widget │ │ Widget │
└───╂────┘ └───╂────┘
┗━━━━━━━━┳━━━━━━━┛
▼
┌───────────────┐
│ DataStructure │
└───────────────┘
如果您随后将原始Widget
指针设置为nullptr
,则您有:
┌────────┐ ┌────────┐
│ Widget │ │ Widget │
└────────┘ └───╂────┘
┃
▼
┌───────────────┐
│ DataStructure │
└───────────────┘
所有权已成功转移,并且两个Widget
s 都可以被销毁而不会导致未定义的行为。