crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

rp80
  опции профиля:
сообщение 22.12.2011, 13:47
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Копирование указателя на объект не приводит к копированию объекта.
Значит следующий код приведет к утечки памяти:

    const char* c =new char[30];
    const char* cc="zca";
    c=cc;//потеряны 30 байт на которые указывал с


Правильно копировать так:
    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 указывают на одно и тоже место в памяти

Теряется ли память выделенная первоначально под s?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Iron Bug
  опции профиля:
сообщение 22.12.2011, 15:01
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(rp80 @ 22.12.2011, 17:54) *
Но вопрос не в этом ) А в том, что хочется понять что конкретно происходит с памятью при копировании локальных переменных.

при копировании переменных данные копируются. а тут ты просто манипулируешь указателями на область данных (ибо константы), так что копируются только значения самих указателей.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 22.12.2011, 15:47
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 22.12.2011, 16:01) *
при копировании переменных данные копируются. а тут ты просто манипулируешь указателями на область данных (ибо константы), так что копируются только значения самих указателей.

Ну вот так вроде понятнее стало. Но все же, чтобы до конца понять ответьте пожалуйста по пунктам. Допустим размер стека 0 байт.
{
 char* s="aaa";//В стеке создается переменная типа char*. Размер стека теперь 4 байта.
//Сами данные пишутся в другое место ?

В какое?


  {
    char* s2="zxcz";//То же самое, что и выше.Размер стека 8 байт
    s=s2;//s указывает туда же куда и s2.

Что происходит с данными s? Как освобождается память занимаемая ими? И освобождается ли вообще?


  }// Здесь переменная s2 уничтожается  Размер стека 4 байта

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


    std::cout<<s<<std::endl;//Выводит zxcz
};//Здесь уничтожается s

Но уничтожаются ли тут данные, на которые указывала s? Ведь выше в аналогичном случае этого не произошло.


Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- rp80   копирование и память   22.12.2011, 13:47
- - Алексей1153   Цитата(rp80 @ 22.12.2011, 16:47) Правильн...   22.12.2011, 13:52
|- - rp80   Цитата(Алексей1153 @ 22.12.2011, 14:52) л...   22.12.2011, 14:06
- - BRE   Цитата(rp80 @ 22.12.2011, 14:47) А что пр...   22.12.2011, 13:53
- - Iron Bug   Цитата(rp80 @ 22.12.2011, 16:47) А что пр...   22.12.2011, 14:03
- - Iron Bug   Цитата(rp80 @ 22.12.2011, 17:06) Понятно,...   22.12.2011, 14:47
|- - rp80   Цитата(Iron Bug @ 22.12.2011, 15:47) ну, ...   22.12.2011, 14:54
|- - BRE   Цитата(rp80 @ 22.12.2011, 15:54) что конк...   22.12.2011, 15:07
- - Iron Bug   Цитата(rp80 @ 22.12.2011, 17:54) Но вопро...   22.12.2011, 15:01
|- - rp80   Цитата(Iron Bug @ 22.12.2011, 16:01) при ...   22.12.2011, 15:47
- - Iron Bug   Цитата(rp80 @ 22.12.2011, 15:47) В какое?...   22.12.2011, 16:03
|- - rp80   Цитата(Iron Bug @ 22.12.2011, 17:03) с ко...   22.12.2011, 19:17
|- - ilyabvt   Цитата(rp80 @ 22.12.2011, 22:17) Цитата(I...   22.12.2011, 19:50
|- - rp80   Цитата(ilyabvt @ 22.12.2011, 20:50) Не за...   22.12.2011, 20:03
|- - ilyabvt   Цитата(rp80 @ 22.12.2011, 23:03) Цитата(i...   22.12.2011, 20:13
|- - rp80   Цитата(ilyabvt @ 22.12.2011, 21:13) Нет к...   22.12.2011, 20:31
- - ilyabvt   Цитата(rp80 @ 22.12.2011, 13:47) Правильн...   22.12.2011, 17:50
|- - Iron Bug   Цитата(ilyabvt @ 22.12.2011, 20:50) Теоре...   22.12.2011, 20:35
|- - rp80   Цитата(Iron Bug @ 22.12.2011, 21:35) смот...   22.12.2011, 23:11
- - Алексей1153   rp80, стек то никуда не девается. А то, что ты пра...   23.12.2011, 7:33
|- - rp80   Цитата(Алексей1153 @ 23.12.2011, 8:33) rp...   23.12.2011, 9:46
- - Iron Bug   Цитата(rp80 @ 23.12.2011, 2:11) Вообще во...   23.12.2011, 7:41
|- - BRE   Цитата(Iron Bug @ 23.12.2011, 8:41) если ...   23.12.2011, 9:17
- - Алексей1153   rp80, значит компилятор разместил переменную не та...   23.12.2011, 9:49
- - Iron Bug   Цитата(BRE @ 23.12.2011, 12:17) (в сегмен...   23.12.2011, 9:55
|- - BRE   Цитата(Iron Bug @ 23.12.2011, 10:55) а, н...   23.12.2011, 10:23
|- - rp80   Цитата(Iron Bug @ 23.12.2011, 10:55) я в ...   23.12.2011, 10:39
|- - BRE   Цитата(rp80 @ 23.12.2011, 11:39) Т.е. ско...   23.12.2011, 10:56
- - Алексей1153   rp80, как разберёшься с указателями на массивы, от...   23.12.2011, 10:41
|- - rp80   Цитата(Алексей1153 @ 23.12.2011, 11:41) r...   23.12.2011, 10:47
- - Алексей1153   rp80, class A { public: int ar[3...   23.12.2011, 14:36


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 11.6.2025, 1:24