Как удалить глобальный динамический массив?
char ***ar=new char**[n];
for(int i=0; i<n; i++)ar=new char*[m];
for(int i=0; i<n; i++)for(int j=0; j<m; j++)ar[j]=new char[p+1];
Переменные и сам массив прописываю в Unit1.h :
...
private: // User declarations
int n;//число строк
int m;//число подстрок
int p;//длина подстроки
char ***ar;//глоб.динамический массив(ar[n][m]
)
...
При выходе из программы в обработчике события TForm1::FormClose() удаляю глобальный динамический массив (или в любом другом обработчике события, кроме TForm1::FormCreate() ):
for(int i=0; i<n; i++)for(int j=0; j<m; j++)delete[]ar[j];
for(int i=0; i<n; i++)delete[]ar;
delete[]ar;
но выскакивает ошибка:
Что я делаю неверно? Почему выскакивает ошибка? Как удалить глобальный динамический массив из другого обработчика события?
В OnCteate я создаю не переменную, а динамический массив. Была бы переменная - никаких проблем. Похоже в С++ глобальных динамических массивов не бывает, а только локальные дин.массивы.
private: // User declarations
[COLOR="red"]char ***ar[/COLOR];
//void __fastcall OnCreate
[COLOR="red"]char ***ar[/COLOR]=new char**[n];
private: // User declarations
[COLOR="red"]char ***ar[/COLOR];
//void __fastcall OnCreate
[COLOR="red"]char ***ar[/COLOR]=new char**[n];
Я же так и делал. Массив создаётся, но в OnClose не удаляется .
void some_func()
{
int i = 2;
std::cout << i; // <--- вот здесь выведется 2, обращение к локальной переменной
std::cout << ::i; //<--- вот здесь выведется 0, обращение к глобальной переменной
}
char ***ar;
void __fastcall TForm::OnCreate()
{
char ***ar = new char ** [n]; //абсолютно тот же случай. Выделил память для локальной переменной, для глобальной одноименной не выделил ни хера
} // здесь потерял локальный указатель, не освободив память - утечка памяти
void __fastcall TForm::OnClose()
{
delete[] ar; //попытка удалить не выделенную память для глобальной переменной
}
void some_func()
{
int i = 2;
std::cout << i; // <--- вот здесь выведется 2, обращение к локальной переменной
std::cout << ::i; //<--- вот здесь выведется 0, обращение к глобальной переменной
}
char ***ar;
void __fastcall TForm::OnCreate()
{
char ***ar = new char ** [n]; //абсолютно тот же случай. Выделил память для локальной переменной, для глобальной одноименной не выделил ни хера
} // здесь потерял локальный указатель, не освободив память - утечка памяти
void __fastcall TForm::OnClose()
{
delete[] ar; //попытка удалить не выделенную память для глобальной переменной
}
Создаётся - да, удаляется - да, но не вызывается в промежуточном обработчике события, например, в OnClick для кнопки.
Вывод неверен. Забирайте зачетку, придете в следующий раз.