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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деструктор временного объекта 
V
    Опции темы
MightyCat
Дата 1.12.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Например есть функция:

Код

char* someFunction(){
  /*
  ....... some code .........
  */
  char* a = new char [x];
  /*
  ....... some code .........
  */
  return a;
}


Вопрос, как освободить память под "а" ?

Уже понял, что назвал тему не корректно и под временным объектом принято считать немного другое. Но так уж назвал smile Спасибо за снисходительность.

Это сообщение отредактировал(а) MightyCat - 1.12.2009, 13:00
PM MAIL ICQ   Вверх
djamshud
Дата 1.12.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



delete[]a;


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
MightyCat
Дата 1.12.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



djamshud, издеваешься? smile
Если я это сделаю до return, то передам вобще не понятно что.
А после нельзя, т.к. выполнение функции заканчивается на return.
PM MAIL ICQ   Вверх
azesmcar
Дата 1.12.2009, 13:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(MightyCat @  1.12.2009,  13:13 Найти цитируемый пост)
djamshud, издеваешься? smile

а ты что спрашивал?

Цитата(MightyCat @  1.12.2009,  12:53 Найти цитируемый пост)
Вопрос, как освободить память под "а" ?

ответ абсолютно точен. smile 

Цитата(MightyCat @  1.12.2009,  13:13 Найти цитируемый пост)
Если я это сделаю до return, то передам вобще не понятно что.
А после нельзя, т.к. выполнение функции заканчивается на return. 

В общем дела обстоят так, либо освобождать память там, где этого делать не следует (в вызывающей части кода), либо возвращай std::vector (или boost::scoped_array).
PM   Вверх
Wisdom
Дата 1.12.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Что значит "освободить память ПОД "а"" ? 
Ты её уже выделил ПОД массив. 
PM MAIL   Вверх
586
Дата 1.12.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Код
char *p = someFunction();
//...
delete []p;

PM   Вверх
MightyCat
Дата 1.12.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(azesmcar @  1.12.2009,  13:27 Найти цитируемый пост)
djamshud, издеваешься? smile

а ты что спрашивал?

Цитата(MightyCat @  1.12.2009,  12:53 Найти цитируемый пост)
Вопрос, как освободить память под "а" ?

ответ абсолютно точен. smile 



azesmcar, это если шутить в стиле Вагановича.


Wisdom, я вот таким удивляюсь. Если Вам нечего сказать, то лучше ничего и не говорить. Да, согласен, немного путано изложил вопрос, но уверен, что для того кто знает, тут все было понятно.


azesmcar, т.е. в теле функции мы это сделать не сможем. Нарушается правило освобождать память там, где ее и выделяли.

Значит, другого решения нет?


Код

char *p = someFunction();
//...
delete []p;




586, спасибо, но это и так понятно. Думал, есть способ сделать это в самой функции.

В следующий раз буду более точно излагать суть вопроса. Чтобы не было казусов с ответами. Всем спасибо smile

Это сообщение отредактировал(а) MightyCat - 1.12.2009, 13:45
PM MAIL ICQ   Вверх
azesmcar
Дата 1.12.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(MightyCat @  1.12.2009,  13:41 Найти цитируемый пост)
azesmcar, т.е. в теле функции мы это сделать не сможем. Нарушается правило освобождать память там, где ее и выделяли.

Значит, другого решения нет? 

т.е. как? smile 
сперва удалить а потом вернуть? или вернуть а потом удалить?  smile Посуди сам, ты возвращаешь указатель, его можно удалять только тогда, когда он больше не нужен. Кто-то должен за этим следить. Я предлагаю чтобы этим КТО-ТО был std::vector smile 

Еще есть вариант описанный 586
но это как раз и есть
Цитата

освобождать память там, где этого делать не следует

вызывающий код не обязан подчищать за твоей функцией, но это так..эстетические правила, работать будет.

Это сообщение отредактировал(а) azesmcar - 1.12.2009, 13:47
PM   Вверх
MightyCat
Дата 1.12.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(azesmcar @  1.12.2009,  13:45 Найти цитируемый пост)
сперва удалить а потом вернуть? или вернуть а потом удалить?  smile Посуди сам, ты возвращаешь указатель, его можно удалять только тогда, когда он больше не нужен. Кто-то должен за этим следить. Я предлагаю чтобы этим КТО-ТО был std::vector smile  


Я еще не так хорошо знаком с с++ как хотелось бы, поэтому и интересуюсь, может есть какая-то возможность возвратить значение и освободить память "одним махом". Понимая как тут обстоят дела, сразу уточню, возвратить значение, а потом освободить память. Ясно, никакого трюка нет.
PM MAIL ICQ   Вверх
azesmcar
Дата 1.12.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(MightyCat @  1.12.2009,  13:47 Найти цитируемый пост)
Я еще не так хорошо знаком с с++ как хотелось бы, поэтому и интересуюсь, может есть какая-то возможность возвратить значение и освободить память "одним махом". Понимая как тут обстоят дела, сразу уточню, возвратить значение, а потом освободить память. Ясно, никакого трюка нет. 

дело в том, что ты не возвращаешь значение, ты возвращаешь УКАЗАТЕЛЬ на данные. Если вернуть указатель на эти данные а потом удалить это ничего не изменит, все равно под возвращенным тобой указателем освобожденная область памяти и при попытке достать эти данные ты получишь скорее всего Access Violation.

Это сообщение отредактировал(а) azesmcar - 1.12.2009, 13:50
PM   Вверх
MightyCat
Дата 1.12.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(azesmcar @  1.12.2009,  13:50 Найти цитируемый пост)
дело в том, что ты не возвращаешь значение, ты возвращаешь УКАЗАТЕЛЬ на данные. Если вернуть указатель на эти данные а потом удалить это ничего не изменит, все равно под возвращенным тобой указателем освобожденная область памяти и при попытке достать эти данные ты получишь скорее всего Access Violation.

Блин, я извиняюсь, но мне это понятно. я мог вернуть не указатель. Как вариант:
Код

char someFunction(){
  /*
  ....... some code .........
  */
  char* a = new char [x];
  /*
  ....... some code .........
  */
  return *(a+2);
}

Спрашивал же, как можно освободить память тут же? Уже обожженный придирчивостью здешних людей, скажу, ясный пень, ведь я мог:
Код

char someCh = *(a+2);
delete [] a;
return someCh; // char someFunction()

Только хотел сделать это без someCh
Вобщем, я уже все понял. Спасибо за внимание smile


Это сообщение отредактировал(а) MightyCat - 1.12.2009, 13:58
PM MAIL ICQ   Вверх
azesmcar
Дата 1.12.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(MightyCat @  1.12.2009,  13:56 Найти цитируемый пост)
Блин, я извиняюсь, но мне это понятно. я мог вернуть не указатель. Как вариант:

Ты спрашиваешь про УКАЗАТЕЛЬ и получаешь ответ про УКАЗАТЕЛЬ. Массив в  C++ нельзя вернуть по значению, можно вернуть vector, которые на самом деле хранит в себе обычный массив.
PM   Вверх
MightyCat
Дата 1.12.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(azesmcar @  1.12.2009,  14:00 Найти цитируемый пост)
Ты спрашиваешь про УКАЗАТЕЛЬ и получаешь ответ про УКАЗАТЕЛЬ. Массив в  C++ нельзя вернуть по значению, можно вернуть vector, которые на самом деле хранит в себе обычный массив. 

Я спрашивал про память, и хотел о ней же получить ответ smile
Уважаемый, если нечего сказать, можете промолчать, я не обижусь.
Добавлено @ 14:13
Цитата(azesmcar @  1.12.2009,  14:00 Найти цитируемый пост)
Ты спрашиваешь про УКАЗАТЕЛЬ и получаешь ответ про УКАЗАТЕЛЬ. Массив в  C++ нельзя вернуть по значению, можно вернуть vector, которые на самом деле хранит в себе обычный массив. 

Про массив также понятно.
Повторяю еще раз, память выделена динамически (раз такая любовь к массивам, сделаем так):
Код

int someFunction(){
  // code
  int* a = new int;
  // somwhere...
  *a = anotherSomeFunction();
  // code
  retun *a;
}

Тут будет утечка памяти? Мы же нигде не освобождаем память выделенную под a.
Ой, боюсь что сейчас будет smile))
Знаю что можно сделать так:
Код

  int b = *a;
  delete a;
  return b;

Просто думал есть более изящное решение, как то обернуть-завернуть...

Это сообщение отредактировал(а) MightyCat - 1.12.2009, 14:15
PM MAIL ICQ   Вверх
unicuum
Дата 1.12.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @  1.12.2009,  13:45 Найти цитируемый пост)
Посуди сам, ты возвращаешь указатель, его можно удалять только тогда, когда он больше не нужен. Кто-то должен за этим следить. 

Кстати, то что там пишет MightyCat я комментировать не буду, так как есть разница между копированием (копирующий конструктор) и передачи по указателю. Но можно же автоматически удалять объект, когда на него не остаётся вообще ни одной ссылки, то есть умный указатель. Раз уж затронута тема, можно рассмотреть различные пути реализации и применения, как вот здесь.


--------------------
user posted image
обычный день на винграде
PM   Вверх
mes
Дата 1.12.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(MightyCat @  1.12.2009,  13:02 Найти цитируемый пост)

Просто думал есть более изящное решение, как то обернуть-завернуть...

Вам было предложено в самом начале :

Цитата(azesmcar @  1.12.2009,  12:27 Найти цитируемый пост)
(или boost::scoped_array). 


ну или перепроектировать Вашу задумку...


Цитата(MightyCat @  1.12.2009,  13:02 Найти цитируемый пост)
Знаю что можно сделать так:
Код

 int b = *a;
  delete a;
  return b;

какое отношние приведенный Вами код имеет к Вашему вопросу?

Это сообщение отредактировал(а) mes - 1.12.2009, 14:28


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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