c++ - Переопределение динамического массива


0

Не уверен правильно ли я назвал свою проблему, ну да ладно.

const len = 100;
TButton* Btn[len];

void CreateBtn(int amount) {
    for (int i = 0; i < amount; i++) {
        Btn[i] = new TButton(Form1);
        Btn[i]->Parent = Form1;
        //---
    }
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    CreateBtn(5);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    for (int i = 0; i < len; i++) {
            delete Btn[i];
    }
    CreateBtn(4);
}

Оставил только самое нужное. Сейчас объясню проблему с массивом.

Сначала я в массив Btn заношу 5 элементов, дальше при событии Button1Click массив очищается и в него опять заноситься 5 элементов. Это работает.

Если при события Button1Click я занесу не 5, а уже меньше(4, как в коде выше) то после следующего нажатия (то есть через одно нажатие) на Button1 я получаю ошибку Access violation at address 00000000, Read of address 00000000

Получается если я в первый раз в FromCreate занес определенное количество элементов, то дальше я уже не смогу занести меньше. Как это решить?

Источник
  •  57
  •  1
  • 18 янв 2018 2018-01-18 17:42:07
Ахаха я забыл тип укать, но ошибку это не выдает — 20 янв 20182018-01-20 06:28:24.000000
const len = 100; - а где тип??? — 18 янв 20182018-01-18 22:18:26.000000
а еще лучше использовать умные указатели — 18 янв 20182018-01-18 18:22:12.000000
После delete Btn[i]; следует обнулить указатель, иначе на следующей итерации будет попытка повторно удалить уже удаленный указатель #5, приводящая к неопределенному поведению. — 18 янв 20182018-01-18 18:16:42.000000

1 ответ

1

1) Использовать динамический (настоящий, задаваемый через SetLength) массив, список или вектор (последние лучше подходят по семантике)
2) FreeAndNil, чтобы обеспечить нулевой указатель после уничтожения (не решает всех проблем)
3) Использовать переменную RealCount, которая устанавливается в значение amount

  • 19 янв 2018 2018-01-19 01:33:38
Выбрал для себя третий вариант, как наиболее простой. Всё работает, спасибо — 20 янв 20182018-01-20 06:30:24.000000