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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Локальные переменные и освобождение памяти 
:(
    Опции темы
GydruS
  Дата 4.12.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, профессионалы!
Правильно ли я понимаю, что в приведенном ниже коде после выполнения ф-ии testFunct() значение ее локальной переменной Result просто напросто остается в памяти, и поэтому обращение к тому же участку памяти выводит его значение на экран, но при этом эта памаять уже не является выделенной для переменной (т.к. ф-я отработала) и может быть переписана другой операцией в дальнейшем? Т.е. другими словами в данном примере возвращение значения "ABC" некорректно?

Код

wchar_t* testFunct()
{
    wchar_t Result[256] = {65,66,67,0}; // ABC
    return Result;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    wchar_t* Test;
    Test = testFunct();
    ShowMessage(UnicodeString(Test));  // Выводит ABC!
}

PM MAIL   Вверх
Crafty
Дата 4.12.2010, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GydruS, да всё верно.
PM MAIL   Вверх
toxx
Дата 5.12.2010, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GydruS
Цитата

Правильно ли я понимаю


нет, не правильно вы понимаете, это статический массив из 256 элементов типа int, который вы инициализируете только 4 числами, остальные по умолчанию инициализируются нулями.Другое дело было бы если у вас было 
Код

wchar_t* Result  = new wchar_t[256];

PM MAIL   Вверх
Crafty
Дата 5.12.2010, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(toxx @  5.12.2010,  00:27 Найти цитируемый пост)
это статический массив из 256 элементов типа int

Если бы было ключевое слово static тогда это был бы статический массив, а так этот массив создается  при каждом вызове ф-ции.

GydruS, никогда не возвращай указатель на локальные переменные ф-ции.
Тут посмотри похожий вопрос http://www.wasm.ru/forum/viewtopic.php?id=39407
PM MAIL   Вверх
toxx
Дата 5.12.2010, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Crafty
статический я к тому, что память подчищать не нужно
а то что из стэка возвращается указатель на массив, то это UB(первый раз не обратил внимания, мой косяк), то это да, так делать нельзя.
PM MAIL   Вверх
Crafty
Дата 5.12.2010, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(toxx @  5.12.2010,  03:38 Найти цитируемый пост)
первый раз не обратил внимания, мой косяк

да я тоже вначале не заметил, повнимательней посмотрел уже после твоего поста.

PM MAIL   Вверх
GydruS
Дата 5.12.2010, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Crafty, toxx, Спасибо за разъяснения! Все понял! =)
PM MAIL   Вверх
boostcoder
Дата 5.12.2010, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(toxx @  5.12.2010,  03:38 Найти цитируемый пост)
статический я к тому, что память подчищать не нужно

тогда уж автоматический
PM WWW   Вверх
toxx
Дата 5.12.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



boostcoder
автоматическая память это и есть память в стеке -_-
PM MAIL   Вверх
boostcoder
Дата 5.12.2010, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(toxx @  5.12.2010,  20:59 Найти цитируемый пост)
автоматическая память это и есть память в стеке

и?
я с этим спорил?
PM WWW   Вверх
toxx
Дата 5.12.2010, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

и?
я с этим спорил? 

тогда к чему дополнение ?smile 
PM MAIL   Вверх
boostcoder
Дата 6.12.2010, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(toxx @  5.12.2010,  23:57 Найти цитируемый пост)
к чему дополнение ?

к тому, что когда говоришь что "память/объект/массив автоматический" - не возникает непоняток типа _статическая_память_/_статический_размер_/_переменная_с_квалификатором_static_
PM WWW   Вверх
toxx
Дата 6.12.2010, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

к тому, что когда говоришь что "память/объект/массив автоматический" - не возникает непоняток типа _статическая_память_/_статический_размер_/_переменная_с_квалификатором_static_

т.е. из следующей строки поста не понятно какая память имелась ввиду?
PM MAIL   Вверх
boostcoder
Дата 6.12.2010, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(toxx @  6.12.2010,  00:22 Найти цитируемый пост)
не понятно какая память имелась ввиду?

бр... smile 
читайте это:
Цитата(toxx @  5.12.2010,  00:27 Найти цитируемый пост)
 это статический массив

Цитата(Crafty @  5.12.2010,  03:12 Найти цитируемый пост)
Если бы было ключевое слово static тогда это был бы статический массив

Цитата(toxx @  5.12.2010,  03:38 Найти цитируемый пост)
статический я к тому, что память подчищать не нужно

вот к чему я это.

зы
сами наступаете на грабли, и не понимаете, кто такие грабли.

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


Амеба
Group Icon


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

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



wchar_t Result[256] = {65,66,67,0};
По сути временная копия константного массива, время жизни которой ограничено вызовом функции.

Кстати если ее переоформить (переменную Result) как указатель на константную память, то код будет корректным, поскольку константы имеют неограниченное время жизни.


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

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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