![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| AlanG |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.5.2006 Где: РашЫн ФидирейшЫн Репутация: нет Всего: нет |
Всем доброго времени суток
Меня интересует как происходит распределения памяти при создании копии объекта. Имеем класс который содержит конструктор копирования. Как извесно, он распределяет НОВУЮ память для созданного объекта. Вот только не понятно ГДЕ и КАК он это делае? И еще, если в классе имеем оператор new который тоже распрелеляет память, какая тогда будет связь между памятью от конструктора непосредственно и памятью от оператора new ? Пример:
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Не "как известно", а "как напишешь". Конструкторы не распределяют память. Они инициализируют объект в той памяти, которую им дали. В твоем примере оба объекта создаются на стеке. Если ты в своей реализации конструктора выделяешь память оператором new, то это частный случай. Память выделяется всегда в куче (если ты используешь стандартный new). Никакой связи с тем, какую память получил конструктор, нет. Т.е. как бы ни был создан объект array (как глобальная переменная, как автоматический объект или динамически, через new) - внутренний new будет выделять память одинаково. -------------------- ... |
|||
|
||||
| AlanG |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.5.2006 Где: РашЫн ФидирейшЫн Репутация: нет Всего: нет |
Я наверное НЕдописал кое что Конструкторы копирования, как раз таки распределяют память, для этого они и предусмотрены. Если конструктор копирования ЯВНО не реализован в програме, используется конструктор по умоляанию, но с ним пробдлема, при вызове деструктора, удаляется память каждого из созданных объектов (естественно из этого же класса). Когда создается новый объект (точнее копия объекта а), в данном случае он создается при создании нового объекта a2_copia. (еще может создаватся при вызове функций с передачей объекта). Копия создается именно в тот момент, когда передается параметр в виде объекта. Собствено вопрос: ГДЕ и КАК распределяется память для ЭТОЙ копии (копии объекта а)? Добавлено @ 12:42 Про new я зря упомянул, только запутал..... |
|||
|
||||
| Daevaorn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Ложь!
Сама сигнатура его говорит о том, что он работает уже с выделенной памятью под объекты( что уже сказала Earnest ). На стеке, ты сам это написал:
|
||||||
|
|||||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
когда компилятор встречает вызов конструктора копирования для объекта, который будет размещен в стеке
то скорее всего просто уменьшается указатель стека на sizeof(<структура, представляющая данные объекта класса>) ,байт и call-ом вызывается процедура, соответствующая конструктору копирования (или сгенерированному КК) и туда передается указатель на первый байт данных объекта (текущий (измененный) указатель стека). Собственно эта процедура и инициализирует поля объекта (то есть не занимается выделением памяти а работает уже с существующими адресами) Это сообщение отредактировал(а) MAKCim - 12.6.2006, 12:54 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| AlanG |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.5.2006 Где: РашЫн ФидирейшЫн Репутация: нет Всего: нет |
Тогда я наверное чего то недопонял... Хорошо, а что происходит когда я передаю объект в качестве параметра, другой функции?
|
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Это тоже не так. Распределение\освобождение памяти и конструирование\разрушение объекта - это два разных процесса, никак не связанных. Т.е. только на вид они связаны. Выделение\освобождение памяти - это new\delete. При вызове деструктора память не удаляется. Когда ты пишешь MyClass* pa = new MyClass(аргументы); то сначала выделяется память (оператором new), а потом эта память передается конструктору для инициализации. Если объект размещается на стеке, то память не выделяется, а просто, как написал MAKCim, текущий указатель стека смещается на размер объекта, а предыдущий передается конструктору для инициализации (что-то типа placement new). Собственно, сам механизм placement new - это способ вызвать конструктор в нужной области памяти. Инициализация - это, грубо говоря, присваивание начальных значений данным и, в случае полиморфных классов, присваивание нужного адреса таблице виртуальных ф-й (возможно не одной). Деструктор ... да, в общем, может ничего не делать. Разве что подменяет \ очищает адрес vtable... -------------------- ... |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
1. Изменение указателя стека на размер объекта 2. Передача нужного адреса через стек в процедуру которая соответствует конструктору копий 3. Инициализация полей в этой процедуре 4. Вызов нужной функции (при этом объект будет находится по текущему указаателю стека + 4 байта (на 32 разрядных платформах)) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |