Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выделение памяти внутри функции

307
10 декабря 2008 года
Artem_3A
863 / / 11.04.2008
У меня возник такой вопрос, есть функция
 
Код:
const char* fnGetString()
{
     ........................................................
     char* pszString = new char[iMaxLenReult];
     ........................................................
     ........................................................
     return pszString;
}


она используется следующим образом

 
Код:
........................................................
int iLenResult = fnGetLen(fnGetString());
........................................................


будет ли память выделенная в fnGetString() удалена, если да то где и как это произойдет, если нет то как этого избежать?

И еще корректен ли следующий код?
 
Код:
........................................................
char* pszResult = fnGetString();
........................................................
delete [] pszResult;
38K
10 декабря 2008 года
Tooth
38 / / 07.10.2008
Цитата:
будет ли память выделенная в fnGetString() удалена, если да то где и как это произойдет,



да, будет. там где будет вызван метод delete.



Цитата:
И еще корректен ли следующий код?


он не скомпилируется без явного приведения к char*

1.8K
10 декабря 2008 года
igor_nf
256 / / 13.12.2006
Цитата: Artem_3A
корректен ли следующий код ?
 
Код:
........................................................
char* pszResult = fnGetString();
........................................................
delete [] pszResult;



По всей видимости имелось ввиду не char * а const char *. Насколько я знаю, так можно делать - тогда обычно пишут соответствующий метод для удаления объекта:

 
Код:
void fnDestroyString(const char *pszString) {
      delete [] pszString;
}


Тогда результирующий код будет выглядить так:
 
Код:
const char* pszResult = fnGetString();
     fnDestroyString(pszResult);


Или использовать констукторы/деструкторы.
307
11 декабря 2008 года
Artem_3A
863 / / 11.04.2008
Эм, стоп, будет ли в первом случае утечка памяти? Я так и не понял если честно... Ведь память сначала возвращается из функции а затем передается в функцию, но удаления же не происходит... В таком случае где она удалиться, Tooth...

igor_nf, а смысл написание отдельной функции для удаления памяти, ведь это лишние затраты на вызов?...
288
11 декабря 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: Artem_3A
Эм, стоп, будет ли в первом случае утечка памяти? Я так и не понял если честно... Ведь память сначала возвращается из функции а затем передается в функцию, но удаления же не происходит... В таком случае где она удалиться, Tooth...

igor_nf, а смысл написание отдельной функции для удаления памяти, ведь это лишние затраты на вызов?...



Память, выделенная с помощью оператора new будет освобождена либо при явном вызове delete (независимо в каком месте программы) либо после завершения самого приложения.

307
11 декабря 2008 года
Artem_3A
863 / / 11.04.2008
Цитата: nikitozz
Память, выделенная с помощью оператора new будет освобождена либо при явном вызове delete (независимо в каком месте программы) либо после завершения самого приложения.



Вот, теперь ясно. Спасибо!

240
11 декабря 2008 года
aks
2.5K / / 14.07.2006
В первом случае конечно будет утечка. Именно поэтому не желательно так возвращать выделенную память, потому, что указатель может элементарно никто не принять. А если уж возвращает, то внимательно следить за использованием и желательно предоставлять интерфейс для удаления. )
307
12 декабря 2008 года
Artem_3A
863 / / 11.04.2008
Цитата: aks
В первом случае конечно будет утечка. Именно поэтому не желательно так возвращать выделенную память, потому, что указатель может элементарно никто не принять. А если уж возвращает, то внимательно следить за использованием и желательно предоставлять интерфейс для удаления. )


ок, спасибо, учту!=)

9.3K
15 декабря 2008 года
iridum
175 / / 26.08.2007
Цитата: Artem_3A

igor_nf, а смысл написание отдельной функции для удаления памяти, ведь это лишние затраты на вызов?...



Дело не в лишних затратах, а в правильных интерфейсах, если создаёшь через в-ю, и удаляй через ф-ю, это логично, потом никто не найдёт где выделялась память.... Видел когда память выделяли в длл, а удаляли в приложении, а надо было всего лишь предоставаить вызов для удаления. Ну и кто потом определит где память была выделена и что мы вообще удаляем и вообще каким способом..а лишние затраты потом будут на отладку и исправления багов.

240
16 декабря 2008 года
aks
2.5K / / 14.07.2006
Цитата: iridum
Видел когда память выделяли в длл, а удаляли в приложении, а надо было всего лишь предоставаить вызов для удаления. Ну и кто потом определит где память была выделена и что мы вообще удаляем и вообще каким способом..а лишние затраты потом будут на отладку и исправления багов.


Тут еще можно поиметь баги с разным выравниванием памяти в dll и в исполняемом модуле, если они собраны в разное время с разными настройками или на разных компиляторах.

505
21 декабря 2008 года
vAC
343 / / 28.02.2006
Если необходимо выделение и удаление памяти в разных модулях, то используйте boost::shared_ptr. Помимо автоматического удаления он еще и сохраняет сам "удалитель".
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог