61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
1

Нужно ли очищать char * old value как?

29.04.2019, 23:01. Показов 2456. Ответов 55
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>
#include <stdio.h>
 
 
int main()
{
     long adr=1;
 char * str1, *str2;
 
 
str1 = "Hello1";
printf ("&str1 = %d ",&str1); 
adr = (long)str1;
 
printf ("&hello1 = %d ",adr); 
 
str2 = (char*)adr;
//free (str1);
 
str1 = "new string";
printf ("\n");
printf ("str1 = %s ",str1);
printf ("str2 = %s ",str2);
}
изучая стринги, решил проверить что происходит со старым значением указателя. незнаю правильно ли проверил, но вроде старое значение Hello1 получается так и висит в памяти. как его удалить ?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2019, 23:01
Ответы с готовыми решениями:

Нужно ли очищать термопласту,если да то как?
Вообщем после сборке ПК,походу заляпал разъём видюхи и материнки термопластой.Картинки есть.Видео...

Нужно ли перед удалением контейнера очищать его?
Нужно ли перед удалением контейнера очищать его или в деструкторе по умолчанию вызывается метод...

Класс list, когда нужно очищать память?
не могу разобраться когда нужно очищать память &quot;delete input_&quot; и почему каждый раз выделяя помять...

Нужно ли очищать память, выделенную под вектор?
Доброго времени суток. При работе с динамическими массивами всегда чистил память оператором delete....

55
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
29.04.2019, 23:10 2
Цитата Сообщение от alexbmd Посмотреть сообщение
как его удалить ?
Подождать, пока программа не завершит свою работу.
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
29.04.2019, 23:59  [ТС] 3
да, я немного погулил и как понял там три разных типа памяти (heap, const, еще чтото) и new\free \delete не нужен для указателя НО
вот какой вопрос. если памяти мало (МК) то создавая много char указателей мы я так понимаю можем заполнить всю память выделенную для const ... чем это грозит ?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
30.04.2019, 00:13 4
alexbmd,
Читайте еще раз, а лучше (я настоятельно рекомендую вам) скачайте себе книгу
по С++ для новичков и почитайте там об переменных, памяти и об их выделении.
(Даже нет, не только об этом, лучше все подряд сначала, читайте комплексно,
а не из середины книжки).
Для более полного понимания работы памяти компьютера можете почитать об
Архитектуре компьютера, например, в книжках Танненбаума, ибо если честно делать
пересказ книг такое себе удовольствие.
Тем более у вас нету даже начального понимания работы языка судя по вашим
вопросам.

Не по теме:

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

1
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
30.04.2019, 00:49  [ТС] 5
за что купил за то продал понимаю звучит наверно нелепо
но везде по разному (geeks,stackoverflow, cppreference, tutorialpoint, etc) называют эти стэки\срамы и тд... НО мой вопрос не про название.

что будет если я буду много раз создавать новых , переназначять старых char * string 'ов.
компилятор на уровне компиляции выдаст ошибку ? если например будет превышен лимит памяти выделенный для кода МК (и там же храняться наши константы как я понял)

или он скомпелирует но во время run'а вылетит ошибка\зависнит

или еще какой вариант развития может быть ?
0
зомбяк
1562 / 1211 / 344
Регистрация: 14.05.2017
Сообщений: 3,925
30.04.2019, 00:58 6
alexbmd, в данном случае работаешь исключительно со строковыми литералами (строками, записываемыми в теле программы и подгружаемые одновременно с её кодом) и переменными-указателями на эти строки. Сколько бы не игрался бы с указателями, они во-первых являются локальными переменными и автоматически удалятся, а во-вторых указывают только на строковые литералы и никуда больше.

Это когда перейдёшь к вводу строк пользователем или из файла, вот тогда и нужно будет вспоминать о динамическом выделении памяти и её очистке, либо о массивах char'ов "достаточного" размера.
0
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
30.04.2019, 02:21 7
Цитата Сообщение от alexbmd Посмотреть сообщение
что будет если я буду много раз создавать новых , переназначять старых char * string 'ов.
Рука отвалится.
Сколько раз вы строчку str1 = "Hello1" не выполняйте, str1 всегда будет указывать на один и тот же литерал. Да, этот литерал кушает память, аж один байт на символ. Но по современным меркам это капля в море.

Вот если вы создадите миллион указателей, вы теоретически можете переполнить стек. Но его сожрут сами указатели, а не то, на что они указывают.
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,028
Записей в блоге: 1
30.04.2019, 04:00 8
alexbmd, а то что другие литералы кушают память вас не беспокоит?
ну там например
C++
1
std::cout<<1ll<<2ll<<3ll<<4ll;// long long integers
кошмар! кошмар! кто-то аж по 8*4 байта съел и где это выделено?
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
30.04.2019, 07:58  [ТС] 9
напоминаю речь про МК у которого 16кб памяти под программу и 1кб оперативки.

Renji, Сколько раз вы строчку str1 = "Hello1" не выполняйте

так причем тут первая ссылка которая на тот же адрес или новый указатель на тот же адрес... хотя новый указатель тоже же место занимает , как инт\лонг, нет? и это память забирается из флэша, нет ? т.к. чар поинтеры храняться в флэше

я больше говорил про
C++
1
2
3
4
5
6
7
8
str1 = "Hello1909 very very long  string...."
str1 = "Hello21...."
str1 = "Hello31.."
str1 = "Hello41.."
str1 = "Hello51.."
str1 = "Hello61.."
str1 = "Hello71.."
...
и т.д.
Все стринги же не пропадают из памяти как я вас понял ? тк МК предпологается работает вечно , то и все стринги занимают флэш постоянно, отнимая пространство для собственно кода, правильно?


XML
1
<offtop>а как цитировать собеседника ? два дня смотрю в форму немогу понять :)</offtop>
0
Модератор
Эксперт по электронике
8697 / 6495 / 879
Регистрация: 14.02.2011
Сообщений: 22,717
30.04.2019, 08:17 10
Цитата Сообщение от alexbmd Посмотреть сообщение
напоминаю речь про МК у которого 16кб памяти под программу и 1кб оперативки.
и это писать на С++ оригинально
для МК есть своя ветка https://www.cyberforum.ru/microcontrollers/
Цитата Сообщение от alexbmd Посмотреть сообщение
я больше говорил про
поконкретней
а то в данном куске кода ересь какая то, один указатель на все строки, как ты после этого первую(вторую, третью) строку вызовешь
Цитата Сообщение от alexbmd Посмотреть сообщение
а как цитировать собеседника ? два дня смотрю в форму немогу понять
в нужном сообщении выделяешь мышкой нужный кусок, и появится кнопка цитировать, жми на неё
0
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
30.04.2019, 08:27 11
Цитата Сообщение от alexbmd Посмотреть сообщение
так причем тут первая ссылка которая на тот же адрес или новый указатель на тот же адрес... хотя новый указатель тоже же место занимает , как инт\лонг, нет? и это память забирается из флэша, нет ? т.к. чар поинтеры храняться в флэше
Нет. Код генерируется согласно правилу as if, по которому сохраняется только наблюдаемое поведение программы. Вы не можете наблюдать создал компилятор указатель или нет. Поэтому, компилятор имеет полное право повыкидывать ваши тридцать указателей и вставить вместо них свои пять. Беспокоиться о лишних указателях есть смысл только тогда, когда вы подозреваете что компилятор не сможет переиначить код.

Литералы же да, кушают флеш. Или диск. Или еще какое хранилище данных. Должны же они в программе откуда-то браться.
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
30.04.2019, 12:00  [ТС] 12
Цитата Сообщение от ValeryS Посмотреть сообщение
поконкретней
а то в данном куске кода ересь какая то, один указатель на все строки, как ты после этого первую(вторую, третью) строку вызовешь
так вот я про такую ересь точнее вот как:

но вначале маленькая преамбула - тк я не маг с++ и всех тонкостей незнаю, я только пытаюсь проникнуться велико идеей , короче... char * я вижу как один из способов (а способов не так чтоб уж очень и много я бы даже сказал бедно как мало ) хранить стринги... оно может идеологически неправильно, но другого пока никто не объяснил

так вот, там не ересь, а просто как бы переменная которая походу выполнения программы хранит разные стринги, создающиеся\читающиеся по мере жизни программы. чтото по serial прилетело, мы чтото хотим отправить пользователю ну и тд..
ну и присваивая новый стринг, нам наплевать на старый.. ну как в переменной int n = 10; потом нам понадобилось записать в n = 5 и нам всеравно уже где 10. она нам не нужна больше.

сразу не кидайтесь помидорами , просто объясните почему можно или нельзя так делать ? и как лучше если так нельзя. как же хранить временные строки (именно строки непонятной длины), в массивах ?
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,028
Записей в блоге: 1
30.04.2019, 12:19 13
alexbmd, о чём ты, боже ж мой! У тебя по serial у прилетают стринги и ты их в бесконечное число переменных записываешь? Или всё-таки происходит что-то типа
C++
1
2
3
4
5
while (1)
{
char str[256];// один массив - не бесконечность
gets(str);
}
или ещё хуже, бесконечное число литералов что ли по serial передаёшь?
C++
1
printf("1000011 или мегабайт символов")
0
131 / 76 / 22
Регистрация: 31.08.2016
Сообщений: 611
30.04.2019, 12:51 14
можно сделать один масссив чаров, где будет апсалютна весь текст, ну и внужный момент дергать из него нужные куски нужной длины последовательности нужных чаров, кстати комбинировать их потом тож можно
0
Модератор
Эксперт по электронике
8697 / 6495 / 879
Регистрация: 14.02.2011
Сообщений: 22,717
30.04.2019, 17:35 15
Цитата Сообщение от alexbmd Посмотреть сообщение
char * я вижу как один из способов (а способов не так чтоб уж очень и много я бы даже сказал бедно как мало ) хранить стринги..
char * это указатель в данном случае он указывает на строки, которые в свою очередь, есть массив char
так вот массивы хранятся в памяти ReadOnly, где конкретно не должно волновать, но они лежат там все
и от указателя они не зависят
ты можешь вообще не использовать указатель str1, строки все равно в памяти программы есть

Добавлено через 1 минуту
Цитата Сообщение от alexbmd Посмотреть сообщение
как в переменной int n = 10; потом нам понадобилось записать в n = 5 и нам всеравно уже где 10. она нам не нужна больше.
а в памяти программы есть и 5 и 10
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
01.05.2019, 19:02  [ТС] 16
Цитата Сообщение от ValeryS Посмотреть сообщение
а в памяти программы есть и 5 и 10
а если коллектор прошёлся


читая и углубляясь немного картина проясняется. но все же есть вопросы
heap и stack это у нас read/write область ?
в то время как lvalue это read-only да?


и такой вопрос почему в первом случае я могу использовать NULL как выход из цикла а во втором случае такой же трюк не получается ?
C++
1
2
3
4
5
char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList; ++iList)
{
    cout << *iList;
}
C++
1
2
3
4
5
6
char *pa[] = {"123","456","789", NULL};
while (pa)
{
static int i = 0;
printf("*pa[%d] = %c\n", i , *pa[i]+i); i++;
}
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,028
Записей в блоге: 1
01.05.2019, 19:09 17
alexbmd, ты пишешь какой-то дичайшую шизофазию.
Весь энтузиазм объяснять что-то человеку, который в принципе не в ту степь смотрит, улетучивается.


Ну вот например...
while (pa)
где у тебя в программе pa может поменяться? Это блин имя массива! оно у тебя нигде не изменяется!
у тебя int i изменяется в программе и больше ничего, ну так i и проверяй на условие конца цикла!
1
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
01.05.2019, 19:14 18
Цитата Сообщение от alexbmd Посмотреть сообщение
и такой вопрос почему в первом случае я могу использовать NULL как выход из цикла а во втором случае такой же трюк не получается ?
Потому что foreach циклы записываются иначе. Забудьте вы о МК и read-only памяти хотя бы на годик, вы в изложении своих мыслей машиночитаемым языком плаваете.
C++
1
2
3
4
5
6
7
8
9
10
#include<array>
#include<iostream>
 
int main()
{
    std::array<const char*,3> array{"one","two","three"};
    for(auto str:array)
        std::cout<<str<<std::endl;
    return 0;
}
1
Модератор
Эксперт по электронике
8697 / 6495 / 879
Регистрация: 14.02.2011
Сообщений: 22,717
01.05.2019, 19:15 19
Цитата Сообщение от alexbmd Посмотреть сообщение
а если коллектор прошёлся
а коллектор это кто?
Цитата Сообщение от alexbmd Посмотреть сообщение
во втором случае такой же трюк не получается ?
а где ты во втором случае изменяешь pa??
вообще подключи дизассемблер, дизассемблируй коды,и увидишь что происходит внутри программ, заодно почитай книжки, рекомендую Криса Касперски
1
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
01.05.2019, 19:31  [ТС] 20
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
у тебя int i изменяется в программе и больше ничего, ну так i и проверяй на условие конца цикла!
да чёто зачитался...

C++
1
2
3
4
5
6
while (pa)
{
static int i = 0;
printf("*pa[%d] = %c\n", i , *pa[i]+i); i++;
if (!pa[i]) break;
}
или так
C++
1
2
3
4
5
int i = 0;
while (pa[i])
{
printf("*pa[%d] = %c\n", i , *pa[i]+i); i++;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2019, 19:31
Помогаю со студенческими работами здесь

Как очищать TextOut(x,y)?
Привет всем. Подскажите, как очищать TextOut(x,y)? При нажатии кнопки текст выводиться на image1...

Как очищать таблицу?
Суть: Если в таблице больше 10 строк, то удалять самую раннюю строку, то есть которая была...

Как правильно очищать память?
Как правильно очищать память? char *filePath; // инициализируется в другом участке кода. ...

Память освобождается, только если программа работает при char *c, а нужно при char c
С клавиатуры вводится символьная строка (предложение), размещается в памяти, выводится в том же...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru