копирование и память |
Здравствуйте, гость ( Вход | Регистрация )
копирование и память |
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 указывают на одно и тоже место в памяти здесь массивы заданы статически , они являются константами. Причём на стеке - только указатели, сами данные в странице данных Ничего никуда не утечёт |
|
|
BRE |
22.12.2011, 13:53
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
Iron Bug |
22.12.2011, 14:03
Сообщение
#4
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
|
|
|
rp80 |
22.12.2011, 14:06
Сообщение
#5
|
Студент Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: 0 |
лучше уж так
Ага, можно и так. здесь массивы заданы статически , они являются константами. Причём на стеке - только указатели, сами данные в странице данных Ничего никуда не утечёт А можно поподробнее что за страница данных,какая разница константы они или нет? Разве если просто char* без const написать что-то изменится в работе с памятью? Потом даже если в стеке только указатели, но сами-то данные должны тоже где-то хранится, соответственно под них выделена где-то память, что с этой памятью происходит в момент копирования? Ну или где почитать про это. Не получается ничего толкового нагуглить А что происходит при копировании переменных в стеке? после выхода из функции стек будет почищен от временных переменных. так что ничего не теряется. но и смысла особого в этом нет. Понятно, что при выходе почистится стек, но если в блоке (функции) мы создадим массив на 2гб и он при таком копировании потеряется, то на следующий уже может не хватить места. |
|
|
Iron Bug |
22.12.2011, 14:47
Сообщение
#6
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Понятно, что при выходе почистится стек, но если в блоке (функции) мы создадим массив на 2гб и он при таком копировании потеряется, то на следующий уже может не хватить места. ну, какбэ стек не резиновый. и два гигабайта под стек, может, и можно выделить (опцией при компиляции), но нецелесообразно. если собираешься работать с большими массивами - это куча и динамическое размещение. |
|
|
rp80 |
22.12.2011, 14:54
Сообщение
#7
|
Студент Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: 0 |
ну, какбэ стек не резиновый. и два гигабайта под стек, может, и можно выделить (опцией при компиляции), но нецелесообразно. если собираешься работать с большими массивами - это куча и динамическое размещение. Да это понятно. Вообще работа со стеком крайне быстра при объеме стека меньше 4кб, а далее все становится медленнее. И советуют в общем случае если функция работает с памятью больше 1 мб, то по-любому выделять память в куче. Но вопрос не в этом ) А в том, что хочется понять что конкретно происходит с памятью при копировании локальных переменных. |
|
|
Iron Bug |
22.12.2011, 15:01
Сообщение
#8
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Но вопрос не в этом ) А в том, что хочется понять что конкретно происходит с памятью при копировании локальных переменных. при копировании переменных данные копируются. а тут ты просто манипулируешь указателями на область данных (ибо константы), так что копируются только значения самих указателей. |
|
|
BRE |
22.12.2011, 15:07
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
rp80 |
22.12.2011, 15:47
Сообщение
#10
|
Студент Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: 0 |
при копировании переменных данные копируются. а тут ты просто манипулируешь указателями на область данных (ибо константы), так что копируются только значения самих указателей. Ну вот так вроде понятнее стало. Но все же, чтобы до конца понять ответьте пожалуйста по пунктам. Допустим размер стека 0 байт.
В какое?
Что происходит с данными s? Как освобождается память занимаемая ими? И освобождается ли вообще?
Но данные остаются. т.е. память которую занимали данные на которые указывал s2 не освободилась при уничтожении s2.
Но уничтожаются ли тут данные, на которые указывала s? Ведь выше в аналогичном случае этого не произошло. Спасибо. |
|
|
Текстовая версия | Сейчас: 25.4.2024, 14:07 |