matrix m1(5,5);
matrix m2(5,5);
m1 = matrix(m2);
对于上面的代码(对于任意类,矩阵),当m2的信息被复制到它时,是否会为与m1相关的信息调用析构函数?
答案 0 :(得分:5)
不,赋值运算符需要处理在执行赋值之前释放m1
可能保留的任何资源。只有在m1
即将超出范围时才会调用析构函数。
答案 1 :(得分:3)
不,一旦构造在堆栈上的对象被构造,它就不会被解构,直到它超出范围或者你明确地调用它的析构函数(你可能永远不会这样做)。所以在这种情况下,如果矩阵定义了一个重载的operator =(const matrix& rhs)成员函数,则调用operator =()并将rhs复制到m1中。否则,使用默认分配,它只是将临时矩阵(m2)对象中的所有成员变量复制到m1中,覆盖这些变量的先前值。
答案 2 :(得分:1)
我认为这取决于矩阵是否正确实现了析构函数以及如何实现赋值运算符。如果矩阵有一个有效的析构函数,矩阵使用“赋值交换”(类似于copy-swap惯用法),那么应该正确释放是的。
除此之外,在调用m1 = m2时,您并不需要Matrix(m2)。这只是调用复制构造函数,然后将临时副本分配给m1。因此,正在进行无用的工作。
答案 3 :(得分:1)
这个矩阵是什么容器?如果它的价值,则没有问题。如果它是智能指针,则没有问题。
但如果涉及普通指针怎么办?然后完全取决于matrix::operator=(const matrix&)
的实施。如果需要在那里调用任何析构函数,它应该调用它们。它不是通过魔法发生的,你必须考虑这些事情。
通常,使用普通容器类来保存普通指针是个坏主意。如果未调用析构函数,则会泄漏内存。如果调用析构函数,则在通过另一个指针访问同一对象时会崩溃。 (想象一下,如果你有两个矩阵都包含指向同一个对象的指针。)
因为使用普通容器类来处理普通指针的容器是困难和危险的。专门的容器或专用指针应该用于此目的。
例如,Boost包含specialized container classes专门用于保存指针。 Boost还有shared pointer class,可以由普通容器保存。
你只需要决定应该发生什么。如果您执行a=b;
,a
和b
是否应该指向相同的基础对象?或者是否应为a
创建新对象以指向内部?