Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Коструктор-копировщик: утечка пямяти? 
:(
    Опции темы
HMLd
  Дата 29.7.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



Значит, так..
Наткнулся на такой код.
Имеется конструктр-копировщик.
Код

MyClass::MyClass (const MyClass& rhs)
{
    itsSize = rhs.GetSize ();  // itsSize - определена ранее как private. Размер.
    // itsPtr - в конструкторе определён как int* itsPtr = new int[там что-то]
    itsPtr = new int[itsSize]; // Выделяем новую память - а куда деётся старая?
    for (register int i = 0; i < itsSize; i++)
        *(itsPtr + i) = *(rhs + i);
}

Разве в строке 4 не происходит утечка памяти?
Может в первой строке надо что-нибудь типа delete [] itsPtr?.. 
PM MAIL   Вверх
Sunr1se
Дата 29.7.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 1.5.2006

Репутация: 1
Всего: 13



Если размеры массивов одинаковые - то удалять не надо, а вот если разные... В общем, должно получиться что-то вроде этого:
Код

MyClass::MyClass (const MyClass& rhs)
{
  if ( itsSize != rhs.getSize())
  {
    itsSize = rhs.GetSize();
    delete [] itsPtr;
    itsPtr = new int[itsSize];
  }
  for (int i = 0; i < itsSize; i++)
    *(itsPtr + i) = *(rhs + i);
}
 
--------------------
IRC-канал Винграда 
PM MAIL ICQ   Вверх
Daevaorn
Дата 29.7.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



HMLd, 
Цитата(HMLd @  29.7.2006,  13:20 Найти цитируемый пост)
Разве в строке 4 не происходит утечка памяти?

Это же контсруктор, объекта не существует до вызова конструктора (даже в теле конструктора его ещё нетsmile ), а значит и утекать нечему, т.к. поля класса только что создались.
Sunr1se, 
Мудрите однакоsmile 
PM MAIL WWW   Вверх
DukeCpp
Дата 29.7.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 27.2.2006
Где: St.Petersburg

Репутация: нет
Всего: 1



Цитата(HMLd @  29.7.2006,  12:20 Найти цитируемый пост)
Имеется конструктр-копировщик.

он как раз и нужен для того, чтобы после его вызова было на один объект больше, чем было (таких объектов);
а "утечка памяти" - это ситуация, когда память выделена и не удалена и/или не может быть удалена по причине потери всех ссылок и указателей не эту область памяти; а память из-под предыдущего объекта удалена -- должна быть (и будет) при вызове деструктора (если он правильно описан).  

Это сообщение отредактировал(а) DukeCpp - 29.7.2006, 14:16
PM   Вверх
DeadSoul
Дата 29.7.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(Sunr1se @  29.7.2006,  12:37 Найти цитируемый пост)
    delete [] itsPtr;


Sunr1se, а вот тут неопределенное поведение. Указатель указывает неизвестно куда 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
HMLd
Дата 29.7.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



smile
2All
Кхм...
Одно из двух: или я торможу, или я не подробно объяснил.
Итак, имеется некий объект класса MyClass, под приватную переменную которого выделена динамическая память, на которую ссылается указатель itsPtr. Далее при попытке скопировать объект вызывается конструктор-копировщик. В его теле видим строку:
Код

itsPtr = new int[itsSize];

Насколько я понимаю, в этой строке выделяется НОВАЯ память и теперь наш указатель itsPtr указывает именно на этот блок памяти. А память, на которую он ссылался раньше - ?... Что с ней?.. Указателя на неё нет, доступа не получить... Или я в чём то ошибаюсь?  ;) 
 
PM MAIL   Вверх
BreakPointMAN
Дата 29.7.2006, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Цитата(HMLd @  29.7.2006,  16:23 Найти цитируемый пост)
Одно из двух: или я торможу, или я не подробно объяснил.

Первое.

Не путай конструктор копирования и оператор присваивания.

Добавлено @ 16:14 
Цитата(HMLd @  29.7.2006,  16:23 Найти цитируемый пост)
конструктор-копировщик

создает новый объект из уже существующего, в нем переменная itsPtr типа int* первоначально ни на что не указывает, она содержит мусор, ибо память еще не выделялась динамически, чем как раз и занимается конструктор-копировщик. 


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
HMLd
Дата 29.7.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



BreakPointMAN, спасибо, догнал наконец-то... Ты прав, в голове что-то попуталось с оператором присваивания... smile
Спасибо всем.

Добавлено @ 17:23 
Почему-то считал, что itsPtr - переменная объекта rhs, а не того, который создаётся. Глупо.
Ещё раз спасибо. smile 
PM MAIL   Вверх
Sunr1se
Дата 29.7.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 1.5.2006

Репутация: 1
Всего: 13



Цитата(Daevaorn @  29.7.2006,  14:08 Найти цитируемый пост)
Sunr1se, 
Мудрите однакоsmile  

Ой, чего-то я с оператором присваивания перепутал. Надо было вопрос внимательнее читать мне. smile 
--------------------
IRC-канал Винграда 
PM MAIL ICQ   Вверх
EvgenZ
Дата 3.8.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



Цитата(Sunr1se @ 29.7.2006,  17:29)
Цитата(Daevaorn @  29.7.2006,  14:08 Найти цитируемый пост)
Sunr1se, 
Мудрите однакоsmile  

Ой, чего-то я с оператором присваивания перепутал. Надо было вопрос внимательнее читать мне. smile

Да ты вообще перемудрил, зачем в конструкторе копий проверка длинны удаление "ничего"

MyClass::MyClass (const MyClass& rhs)
{
     itsSize = rhs.itsSize;
     itsPtr = new int[itsSize];
     for (int i = 0; i < itsSize; i++)
     itsPtr[i] = rhs[i];
}



--------------------
<удалено администрацией форума>
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.