Другие языки программирования и технологии

C++. В данном случае delete нужен?

void функция() { char *stroka; stroka = Таблица->Ячейка[4][7].t_str(); // таблица очень похожа на StringGrid. Преобразую ячейку, сохраняю в строку. ....delete stroka; //надо? Или при выходе из фукнции всё само удалится вместе с объектом Таблица? }
Кирилл прав, но только наполовину.
Итак,
char *stroka; //stroka ссылается куда-то в память, но строка не выделена
stroka = Таблица->Ячейка [4][7].t_str(); //функция t_str() возвращает ссылку на строку, но ВРЕМЕННУЮ - до конца вычисления выражения! После вычисления эта память будет помечена как свободная, а stroka будет на нее сылаться. Что может привести к сбоям.
Правильно будет сделать так:
char *stroka=new char[Таблица->Ячейка [4][7].length()+1];//я точно не знаю, как точно посмотреть размер ячейки в этом твоем "очень похожем на StringGrid"; кури мануалы.
strcpy(stroka,...t_str());//копирование строк в С - только так!
...
delete(stroka);
или выделить строку фиксированного размера (char stroka[2000]) и не удалять - но тогда могут быть проблемы с переполнением.
ЮТ
Юрик Троцко
65 497
Лучший ответ
Стоп
Те не инициализировал указатель на строку:
char *stroka = new char[2000];

и тогда надо будет сделать
delete stroka;

Представь что char* - это просто ярлык на строку. По умолчанию он ведёт в никуда.
Тебе надо ему присвоить куда ему указывать. new - динамически выделяет кусок памяти и возвращает указатель
Вот ты ему и приравниваешь. Но так как ты выделил кусок памяти, тебе нужно его "сдать" обратно - освободить.
Иначе он "зависнет". Если зависы памяти будут цикличны а работа программы долговременная -
отъест всю память и зависнет.

Ответ такой: использовать delete там, где ты динамически создал объект. (или тебе его вернула функция, но с условием что как только он станет не нужным - ты его убъешь)
Игорь Иванов
Игорь Иванов
17 300