記事ディレクトリ
ダーク ホースのコードを見ると、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;
示します。動的に割り当てられた配列メモリ空間を解放するためにC++ で使用される演算子で、配列要素のデストラクタを呼び出して、配列が占めていたメモリ空間を解放します。このコードでは、動的に割り当てられた配列を指し、配列が占有するメモリ空間を解放する。this->pAddress
delete[]
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[]
operatornew
、演算子を使用して動的に割り当てられた単一のオブジェクトのメモリ空間を解放するために使用することも、ポイントされたメモリ空間を解放するために使用することもできません。通常のポインターで。delete[]
演算子を使用して配列以外のメモリ領域を解放したり、delete
演算子を使用して動的に割り当てられたnew[]
配列、未定義の動作が発生し、プログラムのクラッシュやメモリ リークなどの問題が発生する可能性があります。したがって、delete
ordelete[]
演算子を使用する場合、それらが解放するメモリ空間のタイプが、対応する演算子によって割り当てられるメモリ空間のタイプと一致することを確認する必要があります。