您的位置:首页 > 其它

为什么函数对象在for_each中会析构三次

2015-11-05 16:46 190 查看
?
1

2

3

4

5

===========GAP===============

Functor()

1/1

2/3

3/6

4/10

5/15

~Functor()

~Functor()

~Functor()

三次析构的原因:

先附上for_each的源码(VC2008)

?
?
如果把代码改变下:

?
运行结果

Functor()0032F800 //main函数中的实参仿函数对象

Copy Functor()0032F68C //值传递 对【实参对象】拷贝构造了形参对象

1/1

2/3

3/6

4/10

5/15

Copy Functor()0032F7E8 //返回对象的值类型 对【形参对象】拷贝构造

~Functor()0032F68C //析构形参对象

15

~Functor()0032F7E8 //析构返回值对象

~Functor()0032F800 //析构实参对象

现在一目了然了吧!

个人认为使用回调函数高效 由上面的例子可以看出 构造1次 拷贝构造2次 析构3次 是有代价的

最后回到仿函数和回调函数

区别在于:

使用仿函数可以声明在业务相关的类内部 缩小作用域

使用仿函数可以使用类的成员属性和成员函数

仿函数是一个类 可以使用面向对象的各种机制(封装
继承 多态)

若使用回调函数 那么只能声明为某个类的静态成员函数或全局函数,使用类内部的资源需要用一些手段传参,没有直接使用成员函数便捷
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: