Передача auto_ptr в качестве аргумента конструктору - PullRequest
3 голосов
/ 17 февраля 2011

Я хочу иметь возможность передать auto_ptr в качестве аргумента в конструктор. Но если новый объект не может быть создан (вероятно, из-за отсутствия памяти), то я хочу, чтобы оригинальный auto_ptr мог сохранять свое значение.

Например:

foo (Auto_ptr<A> autop1) {
  Auto_ptr<B> autop2(new B(10, autop1, 40));
  if (!autop2.get()) autop1.callFunc(); >>> segmentation fault; But I want to do this!
}

Class B{
  public:
    B(int var1, Auto_ptr<A> var2, int var3): 
      _var1(var1), _var2(var2), _var3(var3){ }
  private:
    int _var1, _var3;
    Auto_ptr<A> _var3;
}

В функции foo () новый объект B не был создан из-за нехватки памяти, а значение autop1 было уничтожено, когда новый оператор вернулся без создания объекта. И когда мы пытаемся получить доступ к autop1, это приводит к ошибке сегмента. Что является хорошим способом избежать этой проблемы. Это нормально, если новый объект был создан, и право собственности было передано его переменным-членам. Я хочу иметь возможность использовать autop1 в foo (), если новый объект B не может быть создан и autop2 будет иметь значение NULL.

1 Ответ

3 голосов
/ 17 февраля 2011

Вы можете передать auto_ptr конструктору B по ссылке и назначить его переменной-члену только тогда, когда вы знаете, что конструктор будет успешным.

...