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
  опции профиля:
сообщение 23.12.2011, 9:55
Сообщение #2


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

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

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




Репутация:   12  


Цитата(BRE @ 23.12.2011, 12:17) *
(в сегментных регистрах храняться уже не адреса, а дескрипторы сегментов из специальных дескрипторных таблицах GDT или LDT

а, ну да. тут ещё оттуда придётся тащить данные. у дров есть функция взятия физического адреса, а вот в юзерспейсе я чота не помню, есть такая фича или нет... я-то живу в основном в кернеле :) а для 64 бит GDT чистая абстракция - там один хрен всё линейно.
в общем, тогда лучше не пытаться гадать, а взять какой-нить стандарт ELF или вендозные спецификации и почитать про конкретные оси и конкретные компиляторы. впрочем, от этого разницы никакой не будет. для программиста интерес представляет размер стека, оптимизация работы с указателями и решение использования стека или кучи. я в юзерских программах не парюсь и использую кучу. ибо она практически не ограничена и чаще всего скорость доступа совершенно не критична, так как юзерские программы обычно и без того тормозят из-за вывода и экономия на адресах не даёт никакого эффекта.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 23.12.2011, 10:39
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(Iron Bug @ 23.12.2011, 10:55) *
я в юзерских программах не парюсь и использую кучу. ибо она практически не ограничена и чаще всего скорость доступа совершенно не критична, так как юзерские программы обычно и без того тормозят из-за вывода и экономия на адресах не даёт никакого эффекта.


Я бы тоже не стал лазить в такие дебри. Но стал тут разбираться с копированием объектов и вот такое поведение непонятно.
class A
{
    public:
    int ar[3];
    int* pi;
    char* str;
    A(){ar[0]=ar[1]=ar[2]=0;pi=new int[3];}
};

int main()
{
    A a1,a2;
    a2=a1;
    a1.ar[0]=98;
    a1.pi[0]=123;
    a1.str="zxcf";
    std::cout<<a2.ar[0]<<"\n"<<a2.pi[0]<<"\n"<<a2.str<<std::endl;
}

Выводит: 0 - 123 - Segmentation fault.
Т.е. скопировался как надо только указатель на динамически выделенную память.

Сообщение отредактировал rp80 - 23.12.2011, 10:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 23.12.2011, 10:56
Сообщение #4


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

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

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




Репутация:   44  


Цитата(rp80 @ 23.12.2011, 11:39) *
Т.е. скопировался как надо только указатель на динамически выделенную память.

Кому надо? Компилятор сделал то что ты ему сказал.
Сделал бинарную копию a2 равную a1 (потеряв при этом указатель на область памяти pi - утечка).
Указатель a2.str как показывал "в никуда", так и показывает - отсюда вылет программы.
Все ожидаемо.


Цитата(rp80 @ 23.12.2011, 11:47) *
И если мы потом поменяем значение по одному указателю, должно поменяться и второе

Так и есть. Там где ты меняешь что-то по указателю, там и меняется (a1.pi[ 0 ] и a2.pi[ 0 ] ).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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 Текстовая версия Сейчас: 29.3.2024, 2:14