Когда переменная переназначается, деструктор не вызывается:
Object foo = Object(a,b);
foo = Object(c,d);
поэтому деструктор будет вызывается только в конце области действия для Object (c, d), что, очевидно, может вызвать проблемы. В данном конкретном случае меня это не слишком беспокоит: достаточно объявить 2 разных объекта:
Object foo1 = Object(a,b);
Object foo2 = Object(c,d);
Таким образом, деструктор обоих объектов будет вызываться в конце.
Однако есть случай, когда мне обязательно нужно переназначить переменную, то есть в конструкторе объекта, например:
SuperObject(Point point1, Point point2) : delay_object_(DelayObject(0)) {
double distance = distance(point1, point2);
double delay = distance / speed;
delay_object_ = DelayObject(delay);
}
На самом деле параметр DelayObject нелегко вычислить (в этом примере я также пропустил несколько других пассажей), и я хочу избежать его в списке инициализации.
Я думал, что могу принудительно удалить объект, поместив объект в кучу и явно вызвав деструктор:
SuperObject(Point point1, Point point2) : p_delay_object_(new DelayObject(0)) {
double distance = distance(point1, point2);
double delay = distance / speed;
delete p_delay_object_;
p_delay_object_ = new DelayObject(delay);
}
но это действительно выглядит некрасиво, так как я предпочитаю использовать динамическое размещение только тогда, когда строго нужно. Я что-то упустил?
Ура!