Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Утечка памяти в конструкторах


Автор: fear 7.6.2006, 13:14
Код

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())? Как избежать утечки памяти, не отказываясь от конструктора по умолчанию? 

Автор: Fazil6 7.6.2006, 13:23
Код

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;    
  }    
}
 

Автор: Daevaorn 7.6.2006, 13:29
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;    
}


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

Автор: Fazil6 7.6.2006, 13:29
или
Код

try     
  {     
   if(m_) delete m_   

   m_ = new int(m); 
  

Автор: Prehistorik 7.6.2006, 14:59
А я больше согласен с Fazil6, Потому что иначе при повторном вызове construct будет опять же утечка.... 

Автор: fear 8.6.2006, 11:14
>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, реализовать эту задачу можно, может кто знает другой способ? 

Автор: Daevaorn 8.6.2006, 11:50
fear, учите мат.часть товарищ
Код

T* ptr = 0;
delete ptr;

Легальный код 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)