调用解构后动态分配的内存中存储的值会发生什么变化?
What happens to the values stored in memory that has been dynamically allocated after the deconstruction is called?
在休闲赋值运算符中,我正在删除我所在的 Class 的动态分配数据成员。我在打开代码时不小心将 "delete" 留在了其中,但它仍然似乎工作得很好。当我调用 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 正在使用,但我很幸运,因为计算机没有编辑存储在当我访问交换功能时,内存 space。
严格来说,删除什么都不算;它不再被拥有,但在其他东西覆盖它之前,这些值仍然存在(对于大多数分配器)。但是,尝试访问未分配的内存是未定义的行为,任何事情都可能发生。
What exactly is happening when I call delete
内存被释放回管理器。
how is the swap function still working if I'm deleting m_itemArray before assigning it to temp in the Swap function?
它恰好还在那里。行为未定义。
您的假设几乎可以肯定是正确的。除非在安全性非常高的系统中或使用调试工具时,没有理由重写已释放的内存(删除操作会发生这种情况)。
实际上,甚至释放本身也可能不会立即发生,而是在更方便的时间执行(此操作可能会变得复杂并成为所谓的 垃圾收集器,这反过来又可以使显式发布变得不必要 - 但话题变得复杂了)。
因此,直到那一刻,内存仍然可以访问并可以使用。即使在之后,该值也有可能不会被重用和覆盖,并且仍然可行(这可能有助于隐藏实际上是危险的错误)。当然,您无法保证,尝试访问释放的内存可能会导致各种麻烦。
要捕获此类错误,对于某些系统,您可以 link 您的可执行文件使用不同的内存管理器或库,这些内存管理器或库将使用随机值或之前的指示值覆盖即将释放的内存实际上释放它。对于没有真正硬件保护支持的旧系统,例如MS-DOS,这是唯一可能的检查,并且在很长一段时间内它仍然是一个流行的选择(我记得 electricfence,例如)。
在休闲赋值运算符中,我正在删除我所在的 Class 的动态分配数据成员。我在打开代码时不小心将 "delete" 留在了其中,但它仍然似乎工作得很好。当我调用 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 正在使用,但我很幸运,因为计算机没有编辑存储在当我访问交换功能时,内存 space。
严格来说,删除什么都不算;它不再被拥有,但在其他东西覆盖它之前,这些值仍然存在(对于大多数分配器)。但是,尝试访问未分配的内存是未定义的行为,任何事情都可能发生。
What exactly is happening when I call delete
内存被释放回管理器。
how is the swap function still working if I'm deleting m_itemArray before assigning it to temp in the Swap function?
它恰好还在那里。行为未定义。
您的假设几乎可以肯定是正确的。除非在安全性非常高的系统中或使用调试工具时,没有理由重写已释放的内存(删除操作会发生这种情况)。
实际上,甚至释放本身也可能不会立即发生,而是在更方便的时间执行(此操作可能会变得复杂并成为所谓的 垃圾收集器,这反过来又可以使显式发布变得不必要 - 但话题变得复杂了)。
因此,直到那一刻,内存仍然可以访问并可以使用。即使在之后,该值也有可能不会被重用和覆盖,并且仍然可行(这可能有助于隐藏实际上是危险的错误)。当然,您无法保证,尝试访问释放的内存可能会导致各种麻烦。
要捕获此类错误,对于某些系统,您可以 link 您的可执行文件使用不同的内存管理器或库,这些内存管理器或库将使用随机值或之前的指示值覆盖即将释放的内存实际上释放它。对于没有真正硬件保护支持的旧系统,例如MS-DOS,这是唯一可能的检查,并且在很长一段时间内它仍然是一个流行的选择(我记得 electricfence,例如)。