|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
18.08.2015, 01:13 | #1 |
Форумчанин
Регистрация: 07.06.2015
Сообщений: 164
|
утечка памяти
Взял листинг кода из книги Стивен Прата Язык программирования С++.
Меня терзают смутные сомнения нет ли здесь утечки памяти, указатель определенный в функции buildstr в куче, не очищается в ней. Очищается указатель ps на результат функции. Адреса &ps!=&pstr, указатели указывают на на одну область. Хочу в своей программе сделать похожий подход, функция возвращает указатель на символьный массив Код:
Последний раз редактировалось Stilet; 18.08.2015 в 09:00. |
18.08.2015, 06:52 | #2 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
Код:
Если нужно использовать указатель несколько раз, его нужно не удалять, а очищать, например так: ps.clear; (для статического указателя) или ps->Clear; для объекта. Но в этом случае должен быть создан объект например так: char *ps = new buildstr(ch, times);
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
18.08.2015, 07:03 | #3 |
Форумчанин
Регистрация: 01.06.2015
Сообщений: 497
|
polin11, указатель на char - это просто адрес, где будет лежать строка.
В данном случае, после каждого вызова buildstr нужно освобождать память через delete[]
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Последний раз редактировалось Krasiosoft; 18.08.2015 в 07:06. |
18.08.2015, 07:18 | #4 | |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
Цитата:
char ch - это объявление указателя как строки с нулём в конце. Очистка строки ch = ""; char *ps = buildstr(ch, times); - объявление статического указателя на объект. Доступ к элементам объекта через точку (ps.clear). char *ps = new buildstr(ch, times); - указатель на динамический объект. Доступ к объекту ps->Clear; delete [] ps; - уничтожение объекта. Т.е. Полное освобождение от него сегмента памяти. Дальнейшее обращение к нему невозможно по причине отсутствия самого объекта.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
|
18.08.2015, 07:40 | #5 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Smitt&Wesson, что за ерунду пишите? Налицо незнание элементарных основ. Не торопитесь советы раздавать.
|
18.08.2015, 07:40 | #6 | ||||
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
Цитата:
Цитата:
Цитата:
Цитата:
P.S. мне кажется, Вы языки перепутали ну или просто троллите новичка Последний раз редактировалось Croessmah; 18.08.2015 в 07:50. |
||||
18.08.2015, 09:02 | #7 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
Просто с марта месяца ни одной строчки не написал (ремонт в квартире). Кое-что подзабылось. А с чарами вообще лет пять уже не работал. Так, что скорее всего, сильно-сильно забыл что там к чему.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
18.08.2015, 12:17 | #8 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
polin11
Взял листинг кода из книги Стивен Прата Язык программирования С++. Меня терзают смутные сомнения нет ли здесь утечки памяти код корректный. выделенная память освобождается после использования, утечек нет. Хочу в своей программе сделать похожий подход не стоит, для с++ код довольно коряв, нужно вручную следить за указателями. возможности языка позволяют гораздо больше, чем постоянно подчищать чью-то память)
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
18.08.2015, 12:45 | #9 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Подход плохой, применять его не нужно на практике.
Или пользуйтесь правилом: кто выделил память, тот её и освободил или пользуйтесь умными указателями или классами "обёртками" типа string, vector,... Вас уже этот мелкий пример ввёл в заблуждение, а на большом проекте совсем запутаетесь где за какой функцией нужно прибрать память. В данном случае предпочтительнее передавать в функцию уже выделенный кусок памяти с указанием размера этого куска, т.е.: Код:
|
18.08.2015, 17:13 | #10 |
Форумчанин
Регистрация: 01.06.2015
Сообщений: 497
|
Такой подход встречается в библиотеках написанных на чистом Си, но там в основном создают и функцию freestr, которую нужно вызывать после buildstr. Но что в нем плохого?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Утечка памяти | OmegaBerkut | Общие вопросы Delphi | 21 | 09.04.2015 22:12 |
утечка памяти | Кудаив | Помощь студентам | 1 | 30.04.2012 18:18 |
Утечка памяти | forivanb | Общие вопросы Delphi | 4 | 11.04.2012 15:28 |
Утечка памяти | ZvEr_HaCkEr | Свободное общение | 13 | 24.09.2010 19:30 |
утечка памяти в С++ | vengo | Общие вопросы C/C++ | 9 | 10.06.2008 21:24 |