Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 775
1

Динамическая память new и delete

09.01.2019, 15:38. Показов 1229. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
имеем след. ситуацию:

C++
1
2
3
4
5
6
7
8
9
10
11
char* str = new char[20];
char* ing = new char[10];
char* string = new char[20];
string = strcat(str, ing);
 
//
//
 
delete[] str;
delete[] ing;
delete[] string;
в результате str и string указывают на один и тот же объект, есть ли смысл в delete[] string;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2019, 15:38
Ответы с готовыми решениями:

Динамическая память new, delete
Всем привет! Столкнулся с понятием "выделение динамической памяти", прочел несколько статей на эту...

Указатели и динамическая память new delete
Начал работать умными указателями, в итоге как понял не сильно освоил то и Cи указатели. 1) В...

Когда высвобождается динамическая память без delete
Доброго времени суток. Прошу подсказку. Знаю что new и delete по возможности вообще нужно...

Азы: статическая память, динамическая память, автоматическая память
столько раз приходистя возвращаться к началу, и все благодаря моим преподавателям, которые не...

6
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
09.01.2019, 15:57 2
Цитата Сообщение от qppq Посмотреть сообщение
есть ли смысл в delete[] string;
Не только смысла нет, но и неправильно, так как поведение не определено, два раза пытаешься освободить один и тот же блок. Программа может просто упасть. А так как оригинальный адрес из string потерялся после strcat, то еще и утечка памяти здесь есть, если нигде больше указатель на сохранялся.
0
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 775
10.01.2019, 09:26  [ТС] 3
стековерфлоу сообщает:
Если указатель указывает на объект, выделенный при помощи new, и для него ещё ни разу не был вызван delete, то вызывать delete можно. Также можно вызывать delete по нулевому указателю (сколько угодно раз).

В любом другом случае — нельзя.
получается если сказать
C++
1
str = NULL;
то необязательный вызов
C++
1
delete[] string;
не приведет к падению, так?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
10.01.2019, 11:41 4
Тебе же написали, что у тебя будет утечка. Та память, которая была выделена под string в третьей строке, благополучно утечет, потому что после выполнения 4-ой строки у тебя string указывает вообще в другое место. На кой вообще понадобилось присваивать string-у результат выполнения операции конкатенации?

Я уж не говорю о том, что все эти пляски с Сишными строковыми функциями в Билдере выглядят убого, когда есть гораздо более мощные средства.
0
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 775
10.01.2019, 13:49  [ТС] 5
Цитата Сообщение от volvo Посмотреть сообщение
На кой вообще понадобилось присваивать string-у результат выполнения операции конкатенации?
C++
1
char *strcat(char *str1, const char *str2);
функция возвращает результат, и значит его можно присвоить, не правда ли, случаи описывать не буду

Цитата Сообщение от volvo Посмотреть сообщение
Та память, которая была выделена под string в третьей строке, благополучно утечет, потому что после выполнения 4-ой строки у тебя string указывает вообще в другое место
в другое? проверим
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
10.01.2019, 14:00 6
Цитата Сообщение от qppq Посмотреть сообщение
функция возвращает результат, и значит его можно присвоить, не правда ли
Првда. Но перед тем, как это делать, неплохо было бы почитать доку на функцию, не правда ли? А там сказано, что
C++
1
char * strcat ( char * destination, const char * source );
Concatenate strings
Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.

destination and source shall not overlap.

Parameters
destination
Pointer to the destination array, which should contain a C string, and be large enough to contain the concatenated resulting string.
source
C string to be appended. This should not overlap destination.

Return Value
destination is returned.
А вот теперь попробуйте меня убедить в необходимости перезаписать указатель, под который выделена память, если все равно вернется указатель на заполненную строку. Не проще ли, если уж ТАК понадобилось иметь еще копию указателя, было написать:
C++
1
2
3
char* str = new char[20];
char* ing = new char[10];
char* string = strcat(str, ing);
, и не парить мозги ни компилятору, ни всем остальным?
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
12.01.2019, 11:06 7
Функция strcat дописывает source справа к destination. Она даже не проверяет достаточность памяти в destination для хранения результирующей строки. Если строки source и destination были сформированы с помощью new[], то их обе надо удалить, используя delete[].
PS: Вместо strcat лучше использовать strncat ИМХО.
0
12.01.2019, 11:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2019, 11:06
Помогаю со студенческими работами здесь

Статическая память,Динамическая память.
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные...

delete[] не освобождает память?
Приветствую! Такая проблема - имеется функция которая должна заменить строку другой строкой по...

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

Динамическая память
Есть 2 массива одной размерности: int *m1 = new int , *m2 = new int ; где N, M некие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru