Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выделение памяти внутри функции  (Прочитано 7517 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kazbek
Гость
« : 22-04-2007 17:27 » 

Проблема такая, в функцию передается указатель на массив char. Внутри функции под этот массив выделяется некоторое количество памяти, после чего управление передается вызывающей программе. А вот после этого корректно освободить память, занятую под массив, я уже не могу (а очень хочется Улыбаюсь ).

Код:
void CquestionDlg::OnBnClickedOk()
{
char *pBuffer = NULL;
My_function(pBuffer);
delete [] pBuffer;
};

void CquestionDlg::My_function(char *pBuffer)
{
pBuffer = new char[100000];
}

Почему так неправильно и как надо?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 22-04-2007 18:09 » 

Kazbek, если указатель нужно изменять в ф-ии, то передавать следует указатель на указатель.

Код: (C++)
void func1(void)
{
  char * buf;

  func2(&buf);
  delete[] buf;
}

void func2(char ** buf_ptr)
{
  *buf_ptr = new char[100000];
}
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 22-04-2007 18:28 » 

Рассмотрим простой пример
Код:
void Some_Func(int a)
{
a=4;
}

int main()
{
int a=2;
Some_Func(a);
return 0;
}
При выходе из функции a все равно будет равно 2, так как при передаче параметра в функцию, ты передаешь копию параметра, а не сам параметр. Чтобы изменения производимые в функции также действовали на саму переменную, нужно передавать ссылку на данную переменную. Соответственно функцию также оформлять, так чтобы она принимала ссылку, а не значение.

Теперь рассмотрим твой пример. Ты пытаешься передать указатель как параметр, естественно любые действия над самим указателем внутри функции не будут иметь действия вне ее Улыбаюсь

Тут есть несколько выходов из положения:
1) Оформить функцию для приема ссылки на указатель
Код:
#define NULL 0

void My_function(char **pBuffer)
{
(*pBuffer) = new char[100000];
}

void OnBnClickedOk()
{
char *pBuffer = NULL;
My_function(&pBuffer);
delete [] pBuffer;
}

int main()
{
OnBnClickedOk();
return 0;
}

2) возвращать с функции указатель и присваивать его к твоему указателю
Код:
char *My_function(void)
{
return new char[100000];
}

void OnBnClickedOk()
{
char *pBuffer = My_function();
delete [] pBuffer;
}

int main()
{
OnBnClickedOk();
return 0;
}
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Kazbek
Гость
« Ответ #3 : 22-04-2007 18:59 » 

Спасибо за помощь вообще и за обстоятельные ответы в частности Улыбаюсь
« Последнее редактирование: 22-04-2007 19:07 от Kazbek » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines