У меня есть несколько классов:
class A():{
public:
A(T t);
};
class B(): {
public:
B(T t);
private:
A* _a;
};
Каков правильный способ создания B
когда у меня есть только t
? Должен ли я создать временную переменную типа A
например:
B::B(T t):
_a( &(A(t)) )
{ ... }
Мне кажется, что это не такая замечательная идея, хотя я не могу точно сказать, почему. Другой вариант (но не намного лучше):
B::B(T t):
_a( 0 )
{
_a = &(A(t));
}
Никогда не делайте этого:
&(anything which lives temporarily)
так как это даст вам свисающий указатель. Зачем? Потому что вы сразу же отправляете адрес того, что нужно удалить.
При выполнении следующих действий:
_a(new A(t))
вы выделяете один и тот же объект, но не удаляете его немедленно. Однако вам необходимо позаботиться о его удалении в какой-то момент вашей программы. Обычно в деструкторе вашего класса, который я не вижу (но тогда позаботьтесь о правиле трех или сделайте класс не скопированным) или используйте умный указатель, который позаботится о вас для удаления.
Пример с std::unique_ptr
:
class B(): {
public:
B(T t) :
_a(new A(t))
{ ... }
private:
std::unique_ptr<A> _a;
};
Вы создаете временное, беря его адрес и сохраняя addres в _a
. Когда закончится конструктор B
, временное значение будет выходить за пределы области видимости и _a все еще указывает на недопустимый объект.
&(A,t)
означать&(A(t))
?