![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
rp80 |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Копирование указателя на объект не приводит к копированию объекта.
Значит следующий код приведет к утечки памяти:
Правильно копировать так:
А что происходит при копировании переменных в стеке?
Теряется ли память выделенная первоначально под s? |
|
|
![]() |
Алексей1153 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Правильно копировать так: 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 |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
лучше уж так
Ага, можно и так. здесь массивы заданы статически , они являются константами. Причём на стеке - только указатели, сами данные в странице данных Ничего никуда не утечёт А можно поподробнее что за страница данных,какая разница константы они или нет? Разве если просто char* без const написать что-то изменится в работе с памятью? Потом даже если в стеке только указатели, но сами-то данные должны тоже где-то хранится, соответственно под них выделена где-то память, что с этой памятью происходит в момент копирования? Ну или где почитать про это. Не получается ничего толкового нагуглить А что происходит при копировании переменных в стеке? после выхода из функции стек будет почищен от временных переменных. так что ничего не теряется. но и смысла особого в этом нет. Понятно, что при выходе почистится стек, но если в блоке (функции) мы создадим массив на 2гб и он при таком копировании потеряется, то на следующий уже может не хватить места. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 7.6.2025, 13:15 |