Строки и распределение памяти (VC++)

Форум для программистов

Строки и распределение памяти (VC++)

Сообщение dAnIK SeNT » Ср фев 26, 2003 2:18 pm

Пишу я к примеру
char *myvar = "sdfsdf";
Очевидно, выделяется 7 байт памяти. Не должен ли я их освобождать самостоятельно? Т.е. понятно, что когда я пишу
char myvar[255] = "sdfsd";
То все ок., т.к. данные размещаются в памяти статически. А вот в случае динамического размещения?
Или еще пример:
Код: выделить все

char *var1, *var2;

var1 = "sdfsdfd"; //выделилась память. надо ли освобождать?

var1 = var2; //var1 просто указывет туда же, куда var2

var1 = "ggggg"; //теперь содержимое var2 тоже равно ""ggggg"


Все ли я понимаю правильно?
Вообще работа с указателями как-то неочевидна. Как я могу различить, когда я присваиваю значение указателю, а когда - тому на что он указывает?
Скажем, у меня есть
int *v;
я хочу выделить под него память. как это сделать? и как ее потом освободить?
допустим, я сделал это. Хочу изменить то значение на которое указывает v. Я пишу:
v = 0xFFFFFF;
А теперь я хочу сделать так, чтобы v указывал на участок памяти по адресу 0xFFFFFF. Как это сделать?
Вопрос next. Некоторая функция возвращает мне строку, под которую она очевидно распределила память. Как мне освободить эту памть?
Спасибо за внимание <!--emo&:)-->Изображение<!--endemo-->
яНЯЕД ОН СОПЪФЙЕ: Athlon 64 X2 5200+ @2,86GHz / nF 570 SLI (ASUS M2N SLI Deluxe) / 4 Gb RAM (4x1Gb Kingston) / 2,9Tb SATAII (0,50+0,64+0,75+1,00Tb WD) / ASUS 8800 GTS512 / 2x NEC-Optiarc AD-7173 / Thermaltake ToughPower 650W / 2x30W Microlab Solo-2 / 20" LCD Benq FP202W (wide) / openSUSE 11.1 / KDE 4.2.1
<!--coloro:Navy--><span style="color:Navy"><!--/coloro-->оН БЯЕЛ БНОПНЯЮЛ - Б email. б ICQ ОНЪБКЪЧЯЭ ПЮГ Б ОНКЦНДЮ.<!--colorc--></span><!--/colorc-->
dAnIK SeNT
Маршал
 
Сообщений: 5101
Зарегистрирован: Чт мар 28, 2002 7:48 pm
Откуда: яяяп
Пункты репутации: 0

Re: Строки и распределение памяти (VC++)

Сообщение ghostwheel » Ср фев 26, 2003 3:34 pm

<!--QuoteBegin--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->Пишу я к примеру
char *myvar = "sdfsdf";
Очевидно, выделяется 7 байт памяти. Не должен ли я их освобождать самостоятельно? Т.е. понятно, что когда я пишу
char myvar[255] = "sdfsd";
То все ок., т.к. данные размещаются в памяти статически. А вот в случае динамического размещения?
Или еще пример:
Код: выделить все

char *var1, *var2;

var1 = "sdfsdfd"; //выделилась память. надо ли освобождать?

var1 = var2; //var1 просто указывет туда же, куда var2

var1 = "ggggg"; //теперь содержимое var2 тоже равно ""ggggg"


Все ли я понимаю правильно?
Вообще работа с указателями как-то неочевидна. Как я могу различить, когда я присваиваю значение указателю, а когда - тому на что он указывает?
Скажем, у меня есть
int *v;
я хочу выделить под него память. как это сделать? и как ее потом освободить?
допустим, я сделал это. Хочу изменить то значение на которое указывает v. Я пишу:
v = 0xFFFFFF;
А теперь я хочу сделать так, чтобы v указывал на участок памяти по адресу 0xFFFFFF. Как это сделать?
Вопрос next. Некоторая функция возвращает мне строку, под которую она очевидно распределила память. Как мне освободить эту памть?
Спасибо за внимание <!--emo&:)-->Изображение<!--endemo--><!--QuoteEnd--></td></tr></table><span class='postcolor'><!--QuoteEEnd-->

Код: выделить все
char *var1, *var2; // определил два указателя

var1 = "sdfsdfd"; //Первый указатель теперь указывает на память

                 // где сидит текстовая константа. Никакой памяти не

                 // выделялось и нечего не надо освобождать.

var1 = var2;      //var1 просто указывет туда же, куда var2 (то есть

                 // неизвестно куда так как var2 не был определен

                 // Или на NULL если var1 и var2 статические.

var1 = "ggggg"; // var2 по-прежнему не определен или NULL



Хочешь выделить память используй new, malloc()/calloc(), или strdup(). Тогда её надо будет освободить при помощи delete или free().

int *v;
v=0xFFFF - v теперь указывает на память по адресу 0xFFFF;

*v = 0xFFF - теперь мы поменяли значение в ячейке памяти по адресу, записанному в v.

Ты все время путаешь указатели и ссылки. Это разные вещи. Короче - учить мат. часть. С самого начала. Возми любую книжку по C++ (даже типа C++ за 10 дней или что-нибудь подобное) и усвой основные концепции - они сильно отличаются от тех языков к которым мне кажется ты привык.
ghostwheel
Ст. сержант
 
Сообщений: 44
Зарегистрирован: Пт дек 27, 2002 10:54 pm
Пункты репутации: 0

Сообщение dAnIK SeNT » Ср фев 26, 2003 4:23 pm

2ghostwheel
Я так и понял <!--emo&:(-->Изображение<!--endemo-->. Но основной гемор у меня именно с указателями - как то все непривычно. Книжки... Попробуем, почитаем <!--emo&:)-->Изображение<!--endemo-->
Кстати, если ты говоришь
v = 0xFFFF - изменяет адрес на который указывает v, то почему прокатывает:
char *f
f = "sdfdsfsdfdsfsd";
и как в этом случае выделяется и освобождается память? автоматически? или вручную надо?
яНЯЕД ОН СОПЪФЙЕ: Athlon 64 X2 5200+ @2,86GHz / nF 570 SLI (ASUS M2N SLI Deluxe) / 4 Gb RAM (4x1Gb Kingston) / 2,9Tb SATAII (0,50+0,64+0,75+1,00Tb WD) / ASUS 8800 GTS512 / 2x NEC-Optiarc AD-7173 / Thermaltake ToughPower 650W / 2x30W Microlab Solo-2 / 20" LCD Benq FP202W (wide) / openSUSE 11.1 / KDE 4.2.1
<!--coloro:Navy--><span style="color:Navy"><!--/coloro-->оН БЯЕЛ БНОПНЯЮЛ - Б email. б ICQ ОНЪБКЪЧЯЭ ПЮГ Б ОНКЦНДЮ.<!--colorc--></span><!--/colorc-->
dAnIK SeNT
Маршал
 
Сообщений: 5101
Зарегистрирован: Чт мар 28, 2002 7:48 pm
Откуда: яяяп
Пункты репутации: 0

Сообщение ghostwheel » Чт фев 27, 2003 7:52 pm

<!--QuoteBegin--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->2ghostwheel
Я так и понял <!--emo&:(-->Изображение<!--endemo-->. Но основной гемор у меня именно с указателями - как то все непривычно. Книжки... Попробуем, почитаем <!--emo&:)-->Изображение<!--endemo-->
Кстати, если ты говоришь
v = 0xFFFF - изменяет адрес на который указывает v, то почему прокатывает:
char *f
f = "sdfdsfsdfdsfsd";
и как в этом случае выделяется и освобождается память? автоматически? или вручную надо?<!--QuoteEnd--></td></tr></table><span class='postcolor'><!--QuoteEEnd-->

Память под текстовую константу была выделена заранее в специально сегменте данных. А не динамически при запуске программы. Все что ты делаешь этим присвоением это записываешь в указатель адрес, где лежит эта константа. Поэтому ничего выделять и ничего освобождать не надо. Но если ты теперь что-нибудь запишешь по адресу в указателе (особенно что-нибудь большее чем исходная константа) то вполне можешь довести программу до GPF.
ghostwheel
Ст. сержант
 
Сообщений: 44
Зарегистрирован: Пт дек 27, 2002 10:54 pm
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13