文章目录
我看黑马代码,在MyArray类中有这样一段代码:
// ...
// 重载= 操作符 防止浅拷贝问题
MyArray &operator=(const MyArray &myarray)
{
if (this->pAddress != NULL)
{
delete[] this->pAddress;
this->m_Capacity = 0;
this->m_Size = 0;
}
this->m_Capacity = myarray.m_Capacity;
this->m_Size = myarray.m_Size;
this->pAddress = new T[this->m_Capacity];
for (int i = 0; i < this->m_Size; i++)
{
this->pAddress[i] = myarray[i];
}
return *this;
}
// ...
里面有一句delete[] this->pAddress;
这里的
delete[] this->pAddress;
是用来释放this->pAddress
所指向的动态数组内存空间的语句。delete[]
是 C++
中用来释放动态分配的数组内存空间的运算符,它会调用数组元素的析构函数,并释放数组所占用的内存空间。在这个代码中,this->pAddress
指向的是一个动态分配的数组,通过delete[] this->pAddress;
释放该数组所占用的内存空间,避免了内存泄漏的问题。
但是我有疑问,this->pAddress
是数组的首元素地址,delete[]
怎么知道这个数组的长度,需要释放多少呢?
this->pAddress 指向的是动态分配的数组的首元素的地址,而不是整个数组的地址。在这个代码中,我们使用 delete[] 运算符来释放动态分配的数组内存空间,它会自动计算数组的大小,并释放整个数组所占用的内存空间。因此,即使 this->pAddress 指向的是数组的首元素的地址,使用 delete[] this->pAddress; 也可以正确地释放整个数组所占用的内存空间。
它怎么自动计算出数组的大小的?
在 C++ 中,使用
new
运算符动态分配数组内存空间时,编译器会在分配内存空间时,额外存储一个整数,用于记录数组的大小。这个整数通常被称为“数组长度”,它存储在数组内存空间的前面,占用 4 个字节(32 位系统)或 8 个字节(64 位系统)的空间。当我们使用delete[]
运算符释放动态分配的数组内存空间时,编译器会自动读取数组长度,并根据数组长度计算出整个数组所占用的内存空间的大小,然后释放该内存空间。因此,我们不需要手动计算数组的大小,也不需要手动释放数组内存空间,编译器会自动完成这些工作。
普通指针不是数组也能用delete[]释放吗?
不可以。
delete[]
运算符只能用于释放使用new[]
运算符动态分配的数组内存空间,不能用于释放使用new
运算符动态分配的单个对象的内存空间,也不能用于释放使用普通指针指向的内存空间。如果我们使用delete[]
运算符来释放非数组内存空间,或者使用delete
运算符来释放使用new[]
运算符动态分配的数组内存空间,都会导致未定义的行为,可能会引发程序崩溃或内存泄漏等问题。因此,在使用delete
或delete[]
运算符时,我们需要确保它们所释放的内存空间类型与它们所对应的运算符所分配的内存空间类型相匹配。