Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> утечка памяти 
:(
    Опции темы
polin11
Дата 18.8.2015, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



Взял листинг кода из книги Стивен Прата Язык программирования С++.
Меня терзают смутные сомнения нет ли здесь утечки памяти, указатель 

определенный в функции buildstr в куче, не очищается в ней. Очищается 

указатель ps на результат функции. Адреса  &ps!=&pstr, указатели указывают на 
на одну область. Хочу в своей программе сделать похожий подход, функция 

возвращает указатель на символьный массив 

Код

#include<iostream>
using namespace std;
char* buildstr(char c, int n);
int main()
{
   int times;
   char ch;
   cout<<"Enter a character";
   cin>>ch;
   cout<<"Enter an integer";
   cin>>times;
   char* ps=buildstr(ch, times); 
   cout<<ps <<"\n";
   delete [] ps;                  //высвобождение памяти
   ps=buildstr('+', 20);          // повторное использование указателя
   cout<<ps <<"DONE" <<ps <<"\n";
   delete [] ps;                   //высвобождение памяти
   return 0;
}

char* buildstr(char c, int n)
{
   char* pstr=new char[n+1];
   pstr[n]='\0';
   while(n-->0)
        pstr[n]=c;
   return pstr;
}

PM MAIL   Вверх
Alexeis
Дата 18.8.2015, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(polin11 @  18.8.2015,  02:18 Найти цитируемый пост)
Адреса  &ps!=&pstr, указатели указывают на 
на одну область. Х

 Там все верно. Главное что указатели указывают на одну память, оператор освобождения тоже с [] и тип аргумента функции delete совпадает с тем что было в new, а так можно освобождать любую копию указателя. На самом деле переменная указателя хранит только адрес памяти. Вся служебная информация по операции выделения хранится в самой ячейки памяти за границами выделенной памяти. Чаще всего по отрицательному смещению от начала выделенной области.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
disputant
Дата 19.8.2015, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Цитата(polin11 @ 18.8.2015,  01:18)
Хочу в своей программе сделать похожий подход, функция 
возвращает указатель на символьный массив 

А какой смысл использовать C++ как C?
Вы программируете на C++? Так string вам в руки (раз уж символьный массив), в крайнем случае unique_ptr или shared_ptr...

Пусть за вас работает язык.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.