码迷,mamicode.com
首页 > 其他好文 > 详细

拷贝控制和资源管理

时间:2019-01-13 11:02:38      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:swap   应该   自定义   一般来说   拷贝构造   动态内存管理   空间   处理   har   

 拷贝控制和资源管理

通常,管理类外资源的类必须定义拷贝控制成员。有两种选择:可以定义拷贝操作,使类的行为看起来像一个值或者像一个指针。

类的行为像一个值,意味着它应该也有自己的状态。当我们拷贝一个像值的对象时,副本和原对象时完全独立的。改变副本不会对原对象由任何影响,反之亦然。

行为像指针的类则共享状态。当我们拷贝一个这种类的对象时,副本和原对象使用相同的底层数据。改变副本也会改变原对象,反之亦然。

IO类型和unique_ptr不允许拷贝或赋值,因此它们的行为既不像值也不像指针。

 

赋值运算符

(1)  如果将一个对象赋予它本身,赋值运算符必须能正确工作

(2)  大多数赋值运算符组合了析构函数和拷贝构造函数的工作

一个喊得方法是在销毁左侧对象资源之前拷贝右侧运算对象。

定义行为像指针的类

使用shared_ptr来管理类中的资源。

交换操作

除了定义拷贝控制成员,管理资源的类通常还定义一个名为swap的函数。

如果一个类定义了自己的swap,那么算法将使用类自定义的版本,否则,算法只能用标准库定义的swap。

std::swap 需要进行一次拷贝和两次赋值操作

更希望swap交换指针

 

与拷贝控制成员不同,swap并不是必要的。但是,对于分配了资源的类,定义swap可能是一种很重要的优化手段。

 

使用拷贝和交换的赋值运算符自动就是异常安全的,且能正确处理自赋值。

 

拷贝赋值运算符通常执行拷贝构造函数和析构函数中也要做的工作。这种情况下,公共的工作应该放在private的工具函数中完成。

 

动态内存管理类

某些类需要在运行时分配可变大小的内存空间。这种类通常可以使用标准库容器来保存它们的数据。

某些类需要自己进行内存分配,这些类一般来说必须定义自己的拷贝控制成员来管理所分配的内存。

移动构造函数和std::move

移动构造函数通常是将资源从给定对象“移动”而不是拷贝到正在创建的对象。而且标准库保证“移后源”仍然保持一个有效的、可析构的状态。

move定义在utility头文件中能够。调用std::move表示希望使用对象的移动构造函数。调用std::move而不是move。

拷贝控制和资源管理

标签:swap   应该   自定义   一般来说   拷贝构造   动态内存管理   空间   处理   har   

原文地址:https://www.cnblogs.com/Summer-8918/p/10262020.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!