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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Утечка памяти в конструкторах 
:(
    Опции темы
fear
Дата 7.6.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

class Object
{
  public:
    Qbject();
    Qbject(unt x, int y, int *m);
    ~Qbject();

    void consrtuct(unt x, int y, int *m);

  private:
    int x_;
    int y_;
    int *m_;
};

Object::Object()
:x_(0), y_(0)
{
  m_ = new int(0);
}

Object::Objectunt x, int y, int *m)
{
  construct(x, y, m);
}

Qbject::~Qbject
{
  delete m;
}

void Object::construct(unt x, int y, int *m)
{
  try
  {
    m_ = new int(m);
    x_ = x;
    y_ = y;
  }
  catch(...)
  {
    delete m;
    throw;
  }
}


где-то в тексте программы
Код

Object obj;
int m = 10;
obj.construct(1,2, &m);


Возникает вопрос, при таком коде не возникает ли утечка памяти из за того что для переменной Qbject::m_ дважды выделяется память (сначала в конструкторе, затем в функции construct())? Как избежать утечки памяти, не отказываясь от конструктора по умолчанию? 
PM MAIL   Вверх
Fazil6
Дата 7.6.2006, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 35
Всего: 60



Код

Object::Objectunt x, int y, int *m)    
{
    m_ = NULL;
  construct(x, y, m);    
}

Код

void Object::construct(unt x, int y, int *m)    
{    
  try    
  {    
   if(!m_)    m_ = new int(m);    
    x_ = x;    
    y_ = y;    
  }    
  catch(...)    
  {    
    delete m;    // по идее лишнее
    throw;    
  }    
}
 
PM MAIL   Вверх
Daevaorn
Дата 7.6.2006, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



fear, зачем m_ = new int(0); ?
Код

Object::Object()
:x_(0), y_(0), m_( 0 )
{
}


зачем try?
Так же проще:
Код

void Object::construct(unt x, int y, int *m)    
{    
   if(!m_)    m_ = new int( *m );
   else *m_ = *m;
   x_ = x;    
   y_ = y;    
}


Зачем самому себе усложнять жизнь?  

Это сообщение отредактировал(а) Daevaorn - 7.6.2006, 13:30
PM MAIL WWW   Вверх
Fazil6
Дата 7.6.2006, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 35
Всего: 60



или
Код

try     
  {     
   if(m_) delete m_   

   m_ = new int(m); 
  

Это сообщение отредактировал(а) Fazil6 - 7.6.2006, 13:31
PM MAIL   Вверх
Prehistorik
Дата 7.6.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А я больше согласен с Fazil6, Потому что иначе при повторном вызове construct будет опять же утечка.... 
--------------------
Есть только один бог - Ассемблер, и С - пророк его. 
PM MAIL   Вверх
fear
Дата 8.6.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



>to Prehistorik
А где ты считаешь у Daevaorn утечка памяти? При повторном вызове construct() для m_ выделяться память уже не будет, изменится лишь значение.
>to Daevaorn
В твоём случае, если объект будет создан деструктором по умолчанию и ф-ция construct() не будет вызвана в деструкторе произойдёт ошибка при попытке освободить память не игициализированного объекта, на который ссылается m_.
Проблему можно решить вызовом в конструкторе по умолчанию construct(0,0,0), который и выполнит  m_ = new int(0);

С этим вообщем всё понятно, что если m_ указатель на массив элементов, а y_ колличество элементов в массиве.
(т.е. m_ = new int[y_];)
Освобождать память, занимаемую массивом и выделять заново в функции construct() как предложил Fazil6, реализовать эту задачу можно, может кто знает другой способ? 
PM MAIL   Вверх
Daevaorn
Дата 8.6.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



fear, учите мат.часть товарищ
Код

T* ptr = 0;
delete ptr;

Легальный код 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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