Другие языки программирования и технологии
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]) и не удалять - но тогда могут быть проблемы с переполнением.
Итак,
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]) и не удалять - но тогда могут быть проблемы с переполнением.
Стоп
Те не инициализировал указатель на строку:
char *stroka = new char[2000];
и тогда надо будет сделать
delete stroka;
Представь что char* - это просто ярлык на строку. По умолчанию он ведёт в никуда.
Тебе надо ему присвоить куда ему указывать. new - динамически выделяет кусок памяти и возвращает указатель
Вот ты ему и приравниваешь. Но так как ты выделил кусок памяти, тебе нужно его "сдать" обратно - освободить.
Иначе он "зависнет". Если зависы памяти будут цикличны а работа программы долговременная -
отъест всю память и зависнет.
Ответ такой: использовать delete там, где ты динамически создал объект. (или тебе его вернула функция, но с условием что как только он станет не нужным - ты его убъешь)
Те не инициализировал указатель на строку:
char *stroka = new char[2000];
и тогда надо будет сделать
delete stroka;
Представь что char* - это просто ярлык на строку. По умолчанию он ведёт в никуда.
Тебе надо ему присвоить куда ему указывать. new - динамически выделяет кусок памяти и возвращает указатель
Вот ты ему и приравниваешь. Но так как ты выделил кусок памяти, тебе нужно его "сдать" обратно - освободить.
Иначе он "зависнет". Если зависы памяти будут цикличны а работа программы долговременная -
отъест всю память и зависнет.
Ответ такой: использовать delete там, где ты динамически создал объект. (или тебе его вернула функция, но с условием что как только он станет не нужным - ты его убъешь)
Похожие вопросы
- Операции new и delete. Операции new и delete нужна теори про данные операции.
- Какой аналог delete из C++ в Java? Есть ли такой, подскажите пожалуйста....
- c++ new\delete: смысл выделения и освобождение памяти для озу из самой же озу?
- Зачем нужен C++, если есть C?
- Помогите!! C ++ Вводится число от 1...999. Вывести данное число на естественном языке. Например, 52 – пятьдесят два.
- С++ Пожалуйста, объясните чайнику о операторах new и delete
- Я программист java,c++,c#,cи, нужен ли я кому нибудь?
- Посоветуйте хорошую книгу без всяких мусорных слов, а только нужных по C++.
- Вопрос актуальности языка C++, расхождение источников. Мне нужна достоверная инфа на это счет.
- Для чего нужны Properties (C#) ? Какая от них польза, в каких случаях они полезны