Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Локальные переменные и освобождение памяти


Автор: GydruS 4.12.2010, 14:52
Здравствуйте, профессионалы!
Правильно ли я понимаю, что в приведенном ниже коде после выполнения ф-ии 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!
}

Автор: Crafty 4.12.2010, 15:39
GydruS, да всё верно.

Автор: toxx 5.12.2010, 00:27
GydruS
Цитата

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


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

wchar_t* Result  = new wchar_t[256];

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

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

GydruS, никогда не возвращай указатель на локальные переменные ф-ции.
Тут посмотри похожий вопрос http://www.wasm.ru/forum/viewtopic.php?id=39407

Автор: toxx 5.12.2010, 03:38
Crafty
статический я к тому, что память подчищать не нужно
а то что из стэка возвращается указатель на массив, то это UB(первый раз не обратил внимания, мой косяк), то это да, так делать нельзя.

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

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

Автор: GydruS 5.12.2010, 18:54
Crafty, toxx, Спасибо за разъяснения! Все понял! =)

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

тогда уж автоматический

Автор: toxx 5.12.2010, 20:59
boostcoder
автоматическая память это и есть память в стеке -_-

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

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

Автор: toxx 5.12.2010, 23:57
Цитата

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

тогда к чему дополнение ?smile 

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

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

Автор: toxx 6.12.2010, 00:22
Цитата

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

т.е. из сhttp://forum.vingrad.ru/forum/topic-316837/kw-%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C.html# строки поста не понятно какая память имелась ввиду?

Автор: boostcoder 6.12.2010, 00:46
Цитата(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 Найти цитируемый пост)
статический я к тому, что память подчищать не нужно

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

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

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

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

Автор: toxx 6.12.2010, 02:00
Цитата

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

это вам так кажется, тут я это слово использовал никак не относящееся к языку программирования, а так как оно есть в словаре(константа, не меняется).

Автор: mes 6.12.2010, 02:07
Цитата(toxx @  6.12.2010,  01:00 Найти цитируемый пост)
это вам так кажется, тут я это слово использовал никак не относящееся к языку программирования,

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

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


Автор: xvr 6.12.2010, 12:53
Цитата(toxx @  6.12.2010,  02:00 Найти цитируемый пост)
тут я это слово использовал никак не относящееся к языку программирования
В 'языке програмирования' есть такое зарезервированное слово 'static', с вполне определенным смыслом (точнее - несколькими смыслами, в зависимости от контекста использования). И если вы употребляете слово 'статический' не в этом смысле, то лучше это явно указывать, во избежание разночтений  smile 

Цитата(toxx @  6.12.2010,  02:00 Найти цитируемый пост)
а так как оно есть в словаре(константа, не меняется). 
В словаре много чего есть. Ну например -
Цитата

Array:
2) войско; вооруженный отряд
// У вас массивы ни на кого не нападали?

5) убор, наряд, одеяние, облачение
// А у вас в программе массивы нарядные?

field:
1) поле; луг
// Озимые в полях структур не сажали?

3) поле, спортивная площадка
// В футбол в пропертях VCL'ных объектов не играли?

О! Кстати-

property:
1) имущество; собственность
// В них наверное даже жить можно! 



Автор: toxx 6.12.2010, 15:47
mes,xvr
У нас массивы ни на кого не нападали smile 

все сдаюсь  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)