Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как удалить глобальный динамический массив?

2.0K
02 апреля 2011 года
oleg_159
77 / / 13.04.2008
Я объявляю глобальный динамический массив в обработчике события TForm1::FormCreate() :
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;
но выскакивает ошибка:


Что я делаю неверно? Почему выскакивает ошибка? Как удалить глобальный динамический массив из другого обработчика события?

535
02 апреля 2011 года
Нездешний
537 / / 17.01.2008
В OnCreate вы создаете дополнительную локальную переменную с тем же именем и именно для нее выделяете память. А удалять пытаетесь член класса, для которого память не выделялась. Чего ж тут удивительного?
2.0K
04 апреля 2011 года
oleg_159
77 / / 13.04.2008
Цитата: Нездешний
В OnCreate вы создаете дополнительную локальную переменную с тем же именем и именно для нее выделяете память. А удалять пытаетесь член класса, для которого память не выделялась. Чего ж тут удивительного?



В OnCteate я создаю не переменную, а динамический массив. Была бы переменная - никаких проблем. Похоже в С++ глобальных динамических массивов не бывает, а только локальные дин.массивы.

535
04 апреля 2011 года
Нездешний
537 / / 17.01.2008
//Unit1.h :
private: // User declarations
[COLOR="red"]char ***ar[/COLOR];

//void __fastcall OnCreate
[COLOR="red"]char ***ar[/COLOR]=new char**[n];
2.0K
05 апреля 2011 года
oleg_159
77 / / 13.04.2008
Цитата: Нездешний
//Unit1.h :
private: // User declarations
[COLOR="red"]char ***ar[/COLOR];

//void __fastcall OnCreate
[COLOR="red"]char ***ar[/COLOR]=new char**[n];



Я же так и делал. Массив создаётся, но в OnClose не удаляется .

535
05 апреля 2011 года
Нездешний
537 / / 17.01.2008
Полный ппц! Есть вообще понимание, что такое области видимости, и как это работает?
Код:
int i = 0;
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; //попытка удалить не выделенную память для глобальной переменной
}
2.0K
10 апреля 2011 года
oleg_159
77 / / 13.04.2008
Цитата: Нездешний
Полный ппц! Есть вообще понимание, что такое области видимости, и как это работает?
Код:
int i = 0;
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 для кнопки.

2.0K
15 апреля 2011 года
oleg_159
77 / / 13.04.2008
Вывод - глобальных динамических массивов не может быть в C++
260
15 апреля 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: oleg_159
Вывод - глобальных динамических массивов не может быть в C++



Вывод неверен. Забирайте зачетку, придете в следующий раз.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог