Чтобы упростить ответ, давайте посмотрим на следующий код:
#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;
}
Вывод:
Деструктор А 1
а затем происходит сбой (выражение: _BLOCK_TYPE_IS_VALID (phead- nBlockUse)).
Нам нужно использовать: delete [] arr; потому что это удаляет весь массив, а не только одну ячейку!
попробуйте использовать delete [] arr; выход:
Деструктор А 10
Деструктор А 9
Деструктор А 8
Деструктор А 7
Деструктор А 6
Деструктор А 5
Деструктор А 4
Деструктор А 3
Деструктор А 2
Деструктор А 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. он не удалит целые указатели в массиве => утечка памяти из объектов указателя!