![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| HMLd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 27.6.2006 Где: Polska Репутация: 1 Всего: 0 |
Значит, так..
Наткнулся на такой код. Имеется конструктр-копировщик.
Разве в строке 4 не происходит утечка памяти? Может в первой строке надо что-нибудь типа delete [] itsPtr?.. |
|||
|
||||
| Sunr1se |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 1.5.2006 Репутация: 1 Всего: 13 |
Если размеры массивов одинаковые - то удалять не надо, а вот если разные... В общем, должно получиться что-то вроде этого:
--------------------
IRC-канал Винграда |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| DukeCpp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 27.2.2006 Где: St.Petersburg Репутация: нет Всего: 1 |
он как раз и нужен для того, чтобы после его вызова было на один объект больше, чем было (таких объектов); а "утечка памяти" - это ситуация, когда память выделена и не удалена и/или не может быть удалена по причине потери всех ссылок и указателей не эту область памяти; а память из-под предыдущего объекта удалена -- должна быть (и будет) при вызове деструктора (если он правильно описан). Это сообщение отредактировал(а) DukeCpp - 29.7.2006, 14:16 |
|||
|
||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Sunr1se, а вот тут неопределенное поведение. Указатель указывает неизвестно куда -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| HMLd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 27.6.2006 Где: Polska Репутация: 1 Всего: 0 |
2All Кхм... Одно из двух: или я торможу, или я не подробно объяснил. Итак, имеется некий объект класса MyClass, под приватную переменную которого выделена динамическая память, на которую ссылается указатель itsPtr. Далее при попытке скопировать объект вызывается конструктор-копировщик. В его теле видим строку:
Насколько я понимаю, в этой строке выделяется НОВАЯ память и теперь наш указатель itsPtr указывает именно на этот блок памяти. А память, на которую он ссылался раньше - ?... Что с ней?.. Указателя на неё нет, доступа не получить... Или я в чём то ошибаюсь? ;) |
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Первое. Не путай конструктор копирования и оператор присваивания. Добавлено @ 16:14 создает новый объект из уже существующего, в нем переменная itsPtr типа int* первоначально ни на что не указывает, она содержит мусор, ибо память еще не выделялась динамически, чем как раз и занимается конструктор-копировщик. -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| HMLd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 27.6.2006 Где: Polska Репутация: 1 Всего: 0 |
BreakPointMAN, спасибо, догнал наконец-то... Ты прав, в голове что-то попуталось с оператором присваивания...
Спасибо всем. Добавлено @ 17:23 Почему-то считал, что itsPtr - переменная объекта rhs, а не того, который создаётся. Глупо. Ещё раз спасибо. |
|||
|
||||
| Sunr1se |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 1.5.2006 Репутация: 1 Всего: 13 |
Ой, чего-то я с оператором присваивания перепутал. Надо было вопрос внимательнее читать мне. --------------------
IRC-канал Винграда |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Да ты вообще перемудрил, зачем в конструкторе копий проверка длинны удаление "ничего" MyClass::MyClass (const MyClass& rhs) { itsSize = rhs.itsSize; itsPtr = new int[itsSize]; for (int i = 0; i < itsSize; i++) itsPtr[i] = rhs[i]; } -------------------- <удалено администрацией форума> |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |