【发布时间】:2019-06-17 15:47:59
【问题描述】:
在闲置的赋值运算符中,我正在删除我所在的类的一个动态分配的数据成员。我在上交代码时不小心留下了“删除”,但它似乎仍然工作得很好。当我调用 delete 时到底发生了什么?如果我在将 m_itemArray 分配给 Swap 函数中的 temp 之前删除它,那么 swap 函数如何仍然工作?
赋值运算符:
Set& Set::operator=(const Set& rhs)
{
if (this != &rhs)
{
delete[] m_itemArray;
Set temp(rhs);
swap(temp);
}
return *this;
}
交换功能:
void Set::swap(Set& other)
{
ItemType * temp = m_itemArray;
m_itemArray = other.m_itemArray;
other.m_itemArray = temp;
}
我现在认为它的工作方式是让计算机访问 m_itemArray 正在使用的内存,但我很幸运,因为此时计算机并没有编辑存储在该内存空间中的任何内容我正在访问交换功能。
【问题讨论】:
-
简而言之?什么都没发生。为什么编译器应该让发生任何事情发生(就效率而言)?
-
如果我之前删除了 m_itemArray,如何设置 temp = m_itemArray?
-
这是未定义的行为。
-
加起来:问undefined behavior的行为是徒劳的,不能肯定回答,因为行为是undefined i>.
-
关于运气的说明。这不是。幸运的是,当程序使错误变得非常明显并迫使您在其他潜伏的错误出现在现场并导致某人死亡之前修复它。
标签: c++ memory-management dynamic-memory-allocation assignment-operator