LINUX.ORG.RU

История изменений

Исправление nanoolinux, (текущая версия) :

Ещё один. И они ещё удивляются, почему спп такой не стабильный и кривой.

class Some
{
  Resource1 *r1;
  Resource2 *r2;
  Resource3 *r3;
  
  public:
    Some(int ident);
    ~Some();
};

Some::Some(int ident)
{
  unique_ptr <Resource1> _r1(new Resource1(ident));
  unique_ptr <Resource2> _r2(new Resource2(ident));
  unique_ptr <Resource3> _r3(new Resource3(_r2.get())); //<- this way works as well
  
  r1 = _r1.release();
  r2 = _r2.release();
  r3 = _r3.release();
}

Some::~Some()
{
  delete r1;
  delete r2;
  delete r3;
}

Но можно ещё лучше (я так и делаю обычно)

class Some2
{
  unique_ptr <Resource1> r1;
  unique_ptr <Resource2> r2;
  unique_ptr <Resource3, function <void (*)(Rousrce3 *)> > r3;  //custom deinit
  
  public:
    Some2(int ident);
}

Some2::Some2(int ident)
    :r1(new Resource1(ident)),
    r2(new Resource2(ident)),
    r3(new Resource3(r2.get()), [] (Resource3 *r) {r->any_deinit_must_be_done_before_delete();})
{
  if (!r1->do_some_tricky_and_return_true()) {
    throw Some2Exception("r1 tricky failed");
  }
}

Исходная версия nanoolinux, :

Ещё один. И они ещё удивляются, почему спп такой не стабильный и кривой.

class Some
{
  Resource1 *r1;
  Resource2 *r2;
  Resource3 *r3;
  
  public:
    Some(int ident);
    ~Some();
};

Some::Some(int ident)
{
  unique_ptr <Resource1> _r1(new Resource1(ident));
  unique_ptr <Resource2> _r2(new Resource2(ident));
  unique_ptr <Resource3> _r3(new Resource3(_r2.get())); //<- this way works as well
  
  r1 = _r1.release();
  r2 = _r2.release();
  r3 = _r3.release();
}

Some::~Some()
{
  delete r1;
  delete r2;
  delete r3;
}

Но можно ещё лучше (я так и делаю обычно)

class Some2
{
  unique_ptr <Resource1> r1;
  unique_ptr <Resource2> r2;
  unique_ptr <Resource3, function <void (*)(Rousrce3 *)> > r3;  //custom deinit
  
  public:
    Some2(int ident);
}

Some2::Some2(int ident)
    :r1(new Resource1(ident)),
    r2(new Resource2(ident)),
    r3(new Resource3(r2.get()), [] (Resource3 *r) {r->any_deinit_must_be_done_before_delete();})
{}