当前位置: 首页 > news >正文

鲜花网站数据库建设分析全国企业信用信息公示系统河北

鲜花网站数据库建设分析,全国企业信用信息公示系统河北,手机广告设计与制作软件,公关公司3.资源管理 条款13:以对象管理资源 以对象管理资源对于传统的堆资源管理,我们需要使用成对的new和delete,这样若忘记delete就会造成内存泄露。因此,我们应尽可能以对象管理资源,并采用RAII(Resource Acqu…

3.资源管理

条款13:以对象管理资源

以对象管理资源对于传统的堆资源管理,我们需要使用成对的new和delete,这样若忘记delete就会造成内存泄露。因此,我们应尽可能以对象管理资源,并采用RAII(Resource Acquisition Is Initialize,资源取得时机便是初始化时机),让析构函数负责资源的释放。

原书此处提到的auto_ptr的内容已经过时,在 C++11 中,通过专一所有权来管理RAII对象可以使用std::unique_ptr,通过引用计数来管理RAII对象可以使用std::shared_ptr。

std::unique_ptr<Investment> pUniqueInv1(CreateInvestment());
std::unique_ptr<Investment> pUniqueInv2(std::move(pUniqueInv1));    // 转移资源所有权std::shared_ptr<Investment> pSharedInv1(CreateInvestment());
std::shared_ptr<Investment> pSharedInv2(pSharedInv1);               // 引用计数+1

智能指针默认会自动delete所持有的对象,我们也可以为智能指针指定所管理对象的释放方式(删除器deleter):

std::unique_ptr<Investment, decltype(GetRidOfInvestment)*> pUniqueInv(CreateInvestment(), GetRidOfInvestment);
std::shared_ptr<Investment> pSharedInv(CreateInvestment(), GetRidOfInvestment);
  • 为防止资源泄露,请使用RAII对象,它们在构造函数中获得资源并在析构函数中析构函数中释放资源
  • 两个常被使用的RAII classes分别是shared_ptr和unique_ptr。前者通常是较佳的选择,因为其copy行为比较直观。

条款14:在资源管理类中小心拷贝行为

我们应该永远保持这样的思考:当一个RAII对象被复制,会发生什么事?

选择一:禁止复制

许多时候允许RAII对象被复制并不合理,如果确是如此,那么就该明确禁止复制行为,条款 6 已经阐述了怎么做这件事。

选择二:对底层资源祭出“引用计数法”

正如std::shared_ptr所做的那样,每一次复制对象就使引用计数+1,每一个对象离开定义域就调用析构函数使引用计数-1,直到引用计数为0就彻底销毁资源。

选择三:复制底层资源

在复制对象的同时复制底层资源的行为又被称作深拷贝(Deep copying),例如在一个对象中有一个指针,那么在复制这个对象时就不能只复制指针,也要复制指针所指向的数据。

选择四:转移底层资源的所有权

和std::unique_ptr的行为类似,永远保持只有一个对象拥有对资源的管理权,当需要复制对象时转移资源的管理权。

条款15:在资源管理类中提供对原始资源的访问

Investment* pRaw = pSharedInv.get();    // 显式访问原始资源
Investment raw = *pSharedInv;           // 隐式访问原始资源

当我们在设计自己的资源管理类时,也要考虑在提供对原始资源的访问时,是使用显式访问还是隐式访问的方法,还是两者皆可。

class Font {
public:FontHandle Get() const { return handle; }       // 显式转换函数operator FontHandle() const { return handle; }  // 隐式转换函数private:FontHandle handle;
};
  • APIs往往要求访问原始资源,所以每一个RAII class应该提供一个“取得其所管理之资源”的方法
  • 对原始资源的访问可能经由显示转换或隐式转换。一般而言显示转换比较安全,但隐式转换对客户比较方便。

条款16:成对使用new和delete要采取相同形式

使用new来分配单一对象,使用new[]来分配对象数组,必须明确它们的行为并不一致,分配对象数组时会额外在内存中记录“数组大小”,而使用delete[]会根据记录的数组大小多次调用析构函数,使用delete则仅仅只会调用一次析构函数。对于单一对象使用delete[]其结果也是未定义的,程序可能会读取若干内存并将其错误地解释为数组大小。

int* array = new int[10];
int* object = new int;delete[] array;
delete object;

需要注意的是,使用typedef定义数组类型会带来额外的风险:
最好不要对数组形式做typedef动作

typedef std::string AddressLines[4];std::string* pal = new AddressLines;    // pal 是一个对象数组,而非单一对象delete pal;                             // 行为未定义
delete[] pal;                           // 正确
  • 如果你在new表达式中使用[ ],必须在相应的delete表达式中也使用[ ]。如果你在new表达式中不适用[], 一定不要在相应的delete表达式中使用[ ]

条款17:以独立语句将 new出的对象置入智能指针

原书此处所讲已过时,现在更好的做法是使用std::make_unique和std::make_shared:

auto pUniqueInv = std::make_unique<Investment>();    // since C++14
auto pSharedInv = std::make_shared<Investment>();    // since C++11

参考:知乎

http://www.yayakq.cn/news/654767/

相关文章:

  • 蜂鸟 网站建设网投网站如何建设
  • 江宁网站制作网站建设是怎么挣钱的
  • 哪些公司需要网站建设微信怎么做淘客网站
  • 网站建设技术总结网页微信看朋友圈
  • 汕头seo网站推广microsoft做网站
  • 门户网站推广渠道建设银行对账单查询网站
  • 四川门户网站建设北京十大教育培训机构排名
  • 青岛公司做网站的价格五大建设是指什么
  • 向公司申请建设网站申请书wordpress生成tags页面
  • 网站建设与功能模块科技部
  • 网站功能项目报价酒店建设网站的意义
  • 网站开发营业执照申请中小企业网络搭建
  • 网站开发和 app开发的区别作风建设年网站
  • 别人做的网站自己根目录吗中小企业建站实战
  • 山西省大同市网站建设公司建设一个门户网站价格
  • 如何做好商务网站的运营怎么做wordpress 工具插件
  • 企业网站建设心得网站建设宣传的目的
  • 织梦网站开发语言网上购物网站开发的目的
  • 龙岗网站设计公司价格怎么建立公司网页
  • 建设工程网站单位名单群晖自行安装wordpress
  • 物流网站建设可行性分析网页设计尺寸规范及标准详解
  • 淮安建设局网站品牌网站排名软件
  • 贵州做旅游的网站东安网站建设
  • 东阿网站建设荟萃浏览器文件夹
  • 响应式网站欣赏最新新闻热点事件2022年
  • 0基础 网站建设c2c电子商务平台举例
  • 网站的推广平台鲜花网站设计
  • 湖南网站搜索排名优化电话一键搭建网站系统
  • 手机购物网站制作简述企业网站的建设过程
  • 杭州做网站的科技公司网站建设的费用需求