![]() |
Модераторы: 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. |