回答を簡素化するために、次のコードを見てみましょう。
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
private:
int m_id;
static int count;
public:
A() {count++; m_id = count;}
A(int id) { m_id = id; }
~A() {cout<< "Destructor A " <<m_id<<endl; }
};
int A::count = 0;
void f1()
{
A* arr = new A[10];
//delete operate only one constructor, and crash!
delete arr;
//delete[] arr;
}
int main()
{
f1();
system("PAUSE");
return 0;
}
出力は次のとおりです: Destructor A 1 そして、クラッシュしています (式: _BLOCK_TYPE_IS_VALID(phead-nBlockUse))。
以下を使用する必要があります。1つのセルだけでなく、配列全体を削除するためです!
delete[] arr; を使用してみてください。出力は次のとおりです。 デストラクタ A 10 デストラクタ A 9 デストラクタ A 8 デストラクタ A 7 デストラクタ A 6 デストラクタ A 5 デストラクタ A 4 デストラクタ A 3 デストラクタ A 2 デストラクタ A 1
同じ原則は、ポインターの配列にも当てはまります。
void f2()
{
A** arr = new A*[10];
for(int i = 0; i < 10; i++)
{
arr[i] = new A(i);
}
for(int i = 0; i < 10; i++)
{
delete arr[i];//delete the A object allocations.
}
delete[] arr;//delete the array of pointers
}
delete[] arr の代わりに delete arr を使用する場合。配列内のポインター全体を削除しません => ポインター オブジェクトのメモリ リーク!