当一个变量被重新赋值时,析构函数不会被调用:
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);
}
但是我觉得这样真的很丑,因为我只在严格必要时才喜欢使用动态分配。我有什么遗漏吗?
干杯!
Object foo(a,b)
呢?然后再将 foo 的值更改为 c 和 d?你为什么觉得正确的做法是创建并复制整个对象呢?我认为你没有考虑堆栈语义。 - Kate Gregory