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, 7:41
Сообщение #2


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

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

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




Репутация:   12  


Цитата(rp80 @ 23.12.2011, 2:11) *
Вообще вот цитата из википедии: A data segment is a portion of virtual address space of a program, which contains the global variables and static variables that are initialized by the programmer.Т.е. они называют сегментом данных то что вы называете сегментом кода. Непонятно кто прав..

ты дальше-то читай википедию. там в целом правильно написано. кусок константных данных в коде они там называют Rodata. а перезаписываемые данные, соответственно, сегментом данных. реализации распределения некоторых переменных в языках высокого уровня могут отличаться. какие-то компиляторы оптимизируют константы и помещают их в код, какие-то - нет, и оставляют их в сегменте данных. в любом случае есть основная разница: сегмент кода не доступен для записи, сегмент данных и стек - это всё, что меняется.
если хочешь глубже понять принципы - читай про ассемблер.
если тебя интересует конкретная реализация - ты можешь просто посмотреть адреса в отладчике, и сравнить с регистрами. в архитектуре PC сегмент кода - это то, куда указывает CS. стек - SS. а данные, как правило, помещаются либо в DS, либо в ES (но там могут быть и адреса других сегментов, если идёт обработка константных данных, например). однако, в дебажном варианте распределение немного другое, там есть ловушки для нулевых смещений и выхода за границы массивов, отсутствие оптимизации размещения и всяческие компиляторные вставки для отладки. там может быть немного другое распределение.

Сообщение отредактировал Iron Bug - 23.12.2011, 7:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 23.12.2011, 9:17
Сообщение #3


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

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

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




Репутация:   44  


Цитата(Iron Bug @ 23.12.2011, 8:41) *
если тебя интересует конкретная реализация - ты можешь просто посмотреть адреса в отладчике, и сравнить с регистрами. в архитектуре PC сегмент кода - это то, куда указывает CS. стек - SS. а данные, как правило, помещаются либо в DS, либо в ES (но там могут быть и адреса других сегментов, если идёт обработка константных данных, например). однако, в дебажном варианте распределение немного другое, там есть ловушки для нулевых смещений и выхода за границы массивов, отсутствие оптимизации размещения и всяческие компиляторные вставки для отладки. там может быть немного другое распределение.

Это было актуально во времена ??-DOS работающей в реальном режиме.
Сейчас большинство ОС работает в защищенном режиме (в сегментных регистрах храняться уже не адреса, а дескрипторы сегментов из специальных дескрипторных таблицах GDT или LDT), да и процессы все выполняются в flat-режиме, в котором все сегменты (код, данные, стек) настраиваются на одни и те жи адреса виртуальной памяти.
Защита выполняется на уровне страниц памяти (защита на уровне сегментов не используется вообще - для скорости).

Сообщение отредактировал BRE - 23.12.2011, 9:18
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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