копирование и память |
Здравствуйте, гость ( Вход | Регистрация )
копирование и память |
rp80 |
22.12.2011, 13:47
Сообщение
#1
|
Студент Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: 0 |
Копирование указателя на объект не приводит к копированию объекта.
Значит следующий код приведет к утечки памяти:
Правильно копировать так:
А что происходит при копировании переменных в стеке?
Теряется ли память выделенная первоначально под s? |
|
|
Iron Bug |
23.12.2011, 7:41
Сообщение
#2
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Вообще вот цитата из википедии: 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 |
если тебя интересует конкретная реализация - ты можешь просто посмотреть адреса в отладчике, и сравнить с регистрами. в архитектуре PC сегмент кода - это то, куда указывает CS. стек - SS. а данные, как правило, помещаются либо в DS, либо в ES (но там могут быть и адреса других сегментов, если идёт обработка константных данных, например). однако, в дебажном варианте распределение немного другое, там есть ловушки для нулевых смещений и выхода за границы массивов, отсутствие оптимизации размещения и всяческие компиляторные вставки для отладки. там может быть немного другое распределение. Это было актуально во времена ??-DOS работающей в реальном режиме. Сейчас большинство ОС работает в защищенном режиме (в сегментных регистрах храняться уже не адреса, а дескрипторы сегментов из специальных дескрипторных таблицах GDT или LDT), да и процессы все выполняются в flat-режиме, в котором все сегменты (код, данные, стек) настраиваются на одни и те жи адреса виртуальной памяти. Защита выполняется на уровне страниц памяти (защита на уровне сегментов не используется вообще - для скорости). Сообщение отредактировал BRE - 23.12.2011, 9:18 |
|
|
Текстовая версия | Сейчас: 28.4.2024, 3:15 |