crossplatform.ru

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

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> копирование и память
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?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 22.12.2011, 13:52
Сообщение #2


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(rp80 @ 22.12.2011, 16:47) *
Правильно копировать так:
    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];


лучше уж так

    char* c =new char[30];
    char* cc="zca";

    delete[] c;
    c=сс;



Цитата(rp80 @ 22.12.2011, 16:47) *
А что происходит при копировании переменных в стеке?
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  


Цитата(rp80 @ 22.12.2011, 14:47) *
А что происходит при копировании переменных в стеке?
Теряется ли память выделенная первоначально под s?

Нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.12.2011, 14:03
Сообщение #4


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

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

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




Репутация:   12  


Цитата(rp80 @ 22.12.2011, 16:47) *
А что происходит при копировании переменных в стеке?

после выхода из функции стек будет почищен от временных переменных. так что ничего не теряется. но и смысла особого в этом нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 22.12.2011, 14:06
Сообщение #5


Студент
*

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

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




Репутация:   0  


Цитата(Алексей1153 @ 22.12.2011, 14:52) *
лучше уж так
    char* c =new char[30];
    char* cc="zca";

    delete[] c;
    c=сс;

Ага, можно и так.
Цитата(Алексей1153 @ 22.12.2011, 14:52) *
здесь массивы заданы статически , они являются константами. Причём на стеке - только указатели, сами данные в странице данных
Ничего никуда не утечёт

А можно поподробнее что за страница данных,какая разница константы они или нет? Разве если просто char* без const написать что-то изменится в работе с памятью?
Потом даже если в стеке только указатели, но сами-то данные должны тоже где-то хранится, соответственно под них выделена где-то память, что с этой памятью происходит в момент копирования?

Ну или где почитать про это. Не получается ничего толкового нагуглить

Цитата(Iron Bug @ 22.12.2011, 15:03) *
Цитата(rp80 @ 22.12.2011, 16:47) *
А что происходит при копировании переменных в стеке?

после выхода из функции стек будет почищен от временных переменных. так что ничего не теряется. но и смысла особого в этом нет.

Понятно, что при выходе почистится стек, но если в блоке (функции) мы создадим массив на 2гб и он при таком копировании потеряется, то на следующий уже может не хватить места.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.12.2011, 14:47
Сообщение #6


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

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

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




Репутация:   12  


Цитата(rp80 @ 22.12.2011, 17:06) *
Понятно, что при выходе почистится стек, но если в блоке (функции) мы создадим массив на 2гб и он при таком копировании потеряется, то на следующий уже может не хватить места.

ну, какбэ стек не резиновый. и два гигабайта под стек, может, и можно выделить (опцией при компиляции), но нецелесообразно. если собираешься работать с большими массивами - это куча и динамическое размещение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 22.12.2011, 14:54
Сообщение #7


Студент
*

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

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




Репутация:   0  


Цитата(Iron Bug @ 22.12.2011, 15:47) *
ну, какбэ стек не резиновый. и два гигабайта под стек, может, и можно выделить (опцией при компиляции), но нецелесообразно. если собираешься работать с большими массивами - это куча и динамическое размещение.

Да это понятно. Вообще работа со стеком крайне быстра при объеме стека меньше 4кб, а далее все становится медленнее. И советуют в общем случае если функция работает с памятью больше 1 мб, то по-любому выделять память в куче.
Но вопрос не в этом ) А в том, что хочется понять что конкретно происходит с памятью при копировании локальных переменных.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.12.2011, 15:01
Сообщение #8


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

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

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




Репутация:   12  


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

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


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


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

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


Студент
*

Группа: Участник
Сообщений: 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? Ведь выше в аналогичном случае этого не произошло.


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

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 25.4.2024, 14:07