博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
effective c++ 条款13 以对象管理资源
阅读量:5876 次
发布时间:2019-06-19

本文共 1085 字,大约阅读时间需要 3 分钟。

我之前写程序很少去考虑new了一个对象何时去delete。往往我不知道何时这个对象何时不用。

Investment* createInvestment();void f(){    Investment* pInv =createInvestment();    ....    delete pInv;}

看到上面我们要考虑到2种情况:

1)当...处有有个条件判断并某个条件成立时return时,这就造成了内存泄露。

2)当我们后期维护时难免会在...处修改,这也有可能造成在delete之前发生异常。

所以 “我们依靠f()总能执行delete”是不靠谱的。

解决办法

利用标准库提供的auto_ptr,auto_ptr是类指针对象,也就是我们说的“智能指针”,使用如下:

void f(){    std::auto_ptr
pInv(createInvestment()); //一如既往的使用pInv,经由auto_ptr的析构函数自动删除pInv;}

为了防止多个auto_ptr同时指向一个对象造成的重复删除对象,auto_ptrs有一个不同寻常的性质,若通过copy构造函数或copy assignment操作符复制它们时,它们会变成null,而复制所得指针将取得资源的唯一拥有权。

void f(){    std::auto_ptr
pInv(createInvestment()); std::auto_ptr
pInv2(pInv); //pInv 变为Null pInv指向对象 pInv = pInv2 //pInv 指向对象 pInv2变为NULL}

auto_ptr的替代方案是RCSP(reference -counting smart pointor) .

如下:

void f(){    std::tr1::shared_ptr
pInv(createInvestment()); std::tr1::shared_ptr
PInv2(pInv); //PInv和PInv2同时指向一个对象。 PInv = Pinv2;}

注意:std::auto_ptr 和 tr1::shared_ptr 只能调用delete,而不能deletep[];

 

转载地址:http://rbzix.baihongyu.com/

你可能感兴趣的文章
【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2
查看>>
nginx+php的使用
查看>>
在 ASP.NET MVC 中使用异步控制器
查看>>
SQL语句的执行过程
查看>>
Silverlight开发历程—动画(线性动画)
查看>>
详解Linux中Load average负载
查看>>
HTTP 协议 Cache-Control 头——性能啊~~~
查看>>
丢包补偿技术概述
查看>>
PHP遍历文件夹及子文件夹所有文件
查看>>
WinForm程序中两份mdf文件问题的解决
查看>>
【转】唯快不破:创业公司如何高效的进行产品研发管理
查看>>
Spark RDD、DataFrame原理及操作详解
查看>>
程序计数器、反汇编工具
查看>>
Android N: jack server failed
查看>>
007-Shell test 命令,[],[[]]
查看>>
关于Linux系统使用遇到的问题-1:vi 打开只读(readonly)文件如何退出保存?
查看>>
pandas 按照某一列进行排序
查看>>
在WPF中如何使用RelativeSource绑定
查看>>
Map的深浅拷贝的探究
查看>>
XSLT语法 在.net中使用XSLT转换xml文档示例
查看>>