копирование и память |
Здравствуйте, гость ( Вход | Регистрация )
копирование и память |
rp80 |
22.12.2011, 13:47
Сообщение
#1
|
Студент Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: 0 |
Копирование указателя на объект не приводит к копированию объекта.
Значит следующий код приведет к утечки памяти:
Правильно копировать так:
А что происходит при копировании переменных в стеке?
Теряется ли память выделенная первоначально под s? |
|
|
Алексей1153 |
22.12.2011, 13:52
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Правильно копировать так: char* c =new char[30]; char* cc="zca"; delete[] c; c=new char[sizeof(cc)]; for(size_t i=0;i<sizeof(cc);++i) c[i]=cc[i]; лучше уж так
А что происходит при копировании переменных в стеке? const char* s="xzczv"; const char* s1="vvb"; s=s1;//s и s1 указывают на одно и тоже место в памяти здесь массивы заданы статически , они являются константами. Причём на стеке - только указатели, сами данные в странице данных Ничего никуда не утечёт |
|
|
rp80 |
22.12.2011, 14:06
Сообщение
#3
|
Студент Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: 0 |
лучше уж так
Ага, можно и так. здесь массивы заданы статически , они являются константами. Причём на стеке - только указатели, сами данные в странице данных Ничего никуда не утечёт А можно поподробнее что за страница данных,какая разница константы они или нет? Разве если просто char* без const написать что-то изменится в работе с памятью? Потом даже если в стеке только указатели, но сами-то данные должны тоже где-то хранится, соответственно под них выделена где-то память, что с этой памятью происходит в момент копирования? Ну или где почитать про это. Не получается ничего толкового нагуглить А что происходит при копировании переменных в стеке? после выхода из функции стек будет почищен от временных переменных. так что ничего не теряется. но и смысла особого в этом нет. Понятно, что при выходе почистится стек, но если в блоке (функции) мы создадим массив на 2гб и он при таком копировании потеряется, то на следующий уже может не хватить места. |
|
|
Текстовая версия | Сейчас: 28.4.2024, 4:16 |