2012-04-14 59 views
4
matrix m1(5,5); 
matrix m2(5,5); 
m1 = matrix(m2); 

对于上面的代码(对于任意类,矩阵),将m2的信息复制到它时,将调用析构函数以获取与m1相关的信息?析构函数调用(堆栈)变量之间的赋值?

+3

这正是调试器所擅长的。 – 2012-04-14 02:34:18

+0

或者一个简单的调试输出。 – chris 2012-04-14 03:01:30

回答

5

否,赋值运算符将需要处理的释放任何资源m1执行任务之前,可能持有。只有在m1即将超出范围时才会调用析构函数。

1

我认为这取决于matrix是否正确实现了析构函数以及如何实现赋值运算符。如果矩阵有一个工作析构函数并且矩阵使用“赋值交换”(类似于复制交换习语),那么是的M1应该被正确释放。

要补充的,你打电话M1 = M2时,并不真正需要的基质(M2)。这只是调用复制构造函数,然后将临时副本分配给m1。因此,无用的工作正在发生。

+0

为什么选择倒票? – keelerjr12 2012-04-14 02:56:22

+0

可能会调用某个临时对象的析构函数,该临时对象存储m1的前一个值,但不应调用m1的析构函数。 – Cosyn 2012-04-14 05:33:35

+0

如上所述,如果存在有效的析构函数和复制构造函数,则赋值运算符将能够释放m1的内容。问题是m1会在赋值时被释放,而不是在离开scope时......请参阅:http:// stackoverflow。COM /问题/ 276173 /什么 - 是 - 你最喜欢-C编码的风格,成语/ 2034447#2034447 – keelerjr12 2012-04-14 05:39:19

3

不,构建一旦它在栈上分配的对象是不是解构,直到它超出范围或显式调用析构函数(你可能应该永远不会做)。因此,在这种情况下,如果矩阵定义了重载运算符=(const矩阵& rhs)成员函数,则调用operator =(),并将rhs复制到m1中。否则,使用默认分配,它将所有成员变量从临时矩阵(m2)对象复制到m1中,覆盖这些变量的先前值。

1

什么是这个矩阵的容器?如果是价值观,那么没有问题。如果它是智能指针,那么没有问题。

但是如果涉及普通的指针呢?那么这完全取决于matrix::operator=(const matrix&)的实施。如果需要在那里调用任何析构函数,它应该调用它们。它不是通过魔法发生的,你必须考虑这些事情。

在一般情况下,这是一个坏主意,用普通的容器类持有普通指针。如果析构函数未被调用,则会泄漏内存。如果调用析构函数,如果通过另一个指针访问同一对象,则会崩溃。 (试想一下,如果你有两个矩阵既包含指向同一个对象。)

既然是困难和危险的使用普通的容器类来处理普通指针的容器。专用容器或专用指针应该用于此目的。

升压,例如,包含specialized container classes专门用于保持指针。 Boost也有一个shared pointer class,可以用普通的容器包装。

你只需要决定会发生什么。如果你这样做a=b;,应该ab指针指向相同的基础对象?或者是否应该为a创建新对象以指向内部?