今天写程序时想用智能指针与vector容器一起解决指针数组的成员管理问题。在我的程序中我用到了多个指针容器,这样就导致了一个问题,这些指针容器的清空非常繁琐,我不能仅仅调用一次clear就能完成,我需要每次从容器中取出一个元素,然后释放掉这个元素所占的内存,之后再清除掉指针,然后再清空容器。我觉得很是麻烦,于是想将其改进,我不需要去管理容器内的这些指针,当容器被清空或者销毁时,我希望这些元素所占的内存也都被释放掉。于是,我想到了智能指针,现将今天的整个过程记录下来,以免日后再犯同样的错误,同时也希望为存在同样疑惑的同学通俗的说明这个问题。

所谓智能指针,我所理解的就是其能够判断该指针的生存周期,在指针的生存周期外对其所占用的内存进行自动释放,而不需要程序员进行主动控制。对于c++的智能指针,我首先想到的是《Thingking in C++》中提到的auto_ptr,于是我就首先想采用auto_ptr来实现。首先定义一个类,重载new和delete操作符,以便我们能看到具体在使用过程中发生了什么。

class CSmart
{
public:CSmart(void);~CSmart(void);CSmart(int i):i(i){}
private:int i;
public:static void * operator new(size_t size){void *p = ::operator new(size);cout<<"Allocting TraceHeap object on the heap at address "<<p<<endl;return p;}static void  operator delete(void *p){cout<<"Deleting TraceHeap object at address "<<p<<endl;::operator delete (p);}int getVal() const { return i ;}
};

然后我们首先来试验下auto_ptr的作用

void test_smart_ptr()
{auto_ptr<CSmart> pCSmart(new CSmart(5));cout<<pCSmart->getVal()<<endl;
}
int main()
{test_smart_ptr();
system("pause");
return 0;
}

输入结果如下:

我们看到在程序运行结束的时候申请的那块内存被成功释放,程序员并没有主动释放。好的,这正是我们想要的功能,那么我们试试赋值的结果,我们把test_smart_ptr的代码改为如下内容:

void test_smart_ptr()
{auto_ptr<CSmart> pCSmart(new CSmart(5));cout<<"ori "<<pCSmart->getVal()<<endl;auto_ptr<CSmart> pCopy;pCopy = pCSmart;cout<<"copy "<<pCopy->getVal()<<endl;//cout<<pCSmart->getVal()<<endl;//Error! 内存读取错误
}

我们发现ok,这一切都是没有问题的,那么我们把上面代码中注释掉的那一行取消掉注释会是什么样的结果呢?

我们发现出现了错误,程序不能运行了,这可如何是好,从错误中我们大概知道是读取了非法的内存地址,那么为什么会出现这样的情况呢,原来是C++标准中定义的auto_ptr中对“=”操作符重载的定义中时将赋值后的值抢夺掉原有值的管理所有权,这样就导致了原有值的不可用。这样,我们自然就想到了本来我们要解决的指针容器自动管理的问题,我们知道在向容器中添加元素的时候,其实就是赋值的操作,现在由于“=”问题,导致其不可用。看来,auto_ptr这个东西在一个函数内作为临时变量是比较好用的,其余的就不那么好用了,在好多资料上关于auto_ptr的使用有这么几点说明:

1、auto_ptr不能共享所有权。
2、auto_ptr不能指向数组
3、auto_ptr不能作为容器的成员。
4、不能通过赋值操作来初始化auto_ptr
std::auto_ptr<int> p(new int(42));     //OK
std::auto_ptr<int> p = new int(42);    //ERROR
这是因为auto_ptr 的构造函数被定义为了explicit
5、不要把auto_ptr放入容器

那么,还有没有其他方法解决本文最开始的问题呢,肯定是有的,于是我们发现了shared_ptr,shared_ptr原来是Boost库中的内容,现在c++11新标准的发布,将其加入到了c++标准库中,可以不必使用Boost库而直接使用。那么我们来改写上面的例子:

void test_smart_ptr()
{shared_ptr<CSmart> pCSmart(new CSmart(5));cout<<"ori "<<pCSmart->getVal()<<endl;shared_ptr<CSmart> pCopy;pCopy = pCSmart;cout<<"copy "<<pCopy->getVal()<<endl;cout<<"ori again "<<pCSmart->getVal()<<endl;
}

结果如下:

我们发现一切正常,好的,那么我们来用容器和只能指针实现对指针容器的管理吧。

void test_smart_ptr()
{vector<shared_ptr<CSmart>> smart_ptr_vector;shared_ptr<CSmart> pCSmart1(new CSmart(5));shared_ptr<CSmart> pCSmart2(new CSmart(10));shared_ptr<CSmart> pCSmart3(new CSmart(15));smart_ptr_vector.push_back(pCSmart1);smart_ptr_vector.push_back(pCSmart2);smart_ptr_vector.push_back(pCSmart3);for(vector<shared_ptr<CSmart>>::iterator it = smart_ptr_vector.begin();it != smart_ptr_vector.end(); it++)cout<<(*it)->getVal()<<endl;//访问其中的每一个元素
}

ok,看运行结果,一切正常,这就是我们要的结果,之后可以按照vector中存入的为普通变量进行处理。

c++智能指针的使用,auto_ptr,shared_ptr相关推荐

  1. C++智能指针详解(auto_ptr、unique_ptr、shared_ptr)

    文章目录 1. 智能指针的应用场景 2. 智能指针的介绍 3. 智能指针的使用与原理 3.1 auto_ptr 3.2 unique_ptr 3.3 shared_ptr 3.4 shared_ptr ...

  2. C++11智能指针(unique_ptr、shared_ptr、weak_ptr)boost::scoped_ptr

    C++11智能指针(unique_ptr.shared_ptr.weak_ptr)_-码农小非-的专栏-CSDN博客_c++ shared_ptr weak_ptr 原创)智能指针拾遗 (原创)智能指 ...

  3. 智能指针(一):STL auto_ptr实现原理

    文章转自:http://blog.csdn.net/weiwenhp/article/details/8706864 版权归原作者! 智能指针实际上是一个类(class),里面封装了一个指针.它的用处 ...

  4. 智能指针(unique_ptr、shared_ptr、weak_ptr)

    主要参考链接:C++ 智能指针最佳实践&源码分析 参考链接:C++11 make_shared - 简书 智能指针在 C++11 标准中被引入真正的标准库(C++98 中引入的 auto_pt ...

  5. C++智能指针:TR1的 shared_ptr 和 weak_ptr 使用介绍

    (所有示例的运行,将#序号所在main()函数去掉序号即可,参考[url]http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15361/ ...

  6. linux怎么编译sharedptr,如何使用智能指针(例如auto_ptr r shared_ptr)在Linux上使用C++生成链接列表数据结构?...

    我需要生成一个列表并返回一个指针,以便其他函数可以使用该列表.该代码工作,但有内存泄漏,因为我使用"新"分配列表的每个新节点. 使用列表后,我必须释放内存. 我的代码如下: #in ...

  7. 使用TR1的智能指针

    作为C++程序员,在没有智能指针,手动管理内存的蛮荒岁月里,可以说是暗无天日,痛苦异常.直到上帝说,还是要有光,于是智能指针进了标准.C++码农的日子总算好起来了. 虽然一直鄙视着没有显式指针的语言, ...

  8. 学习笔记 | c++中的smart pointer四个智能指针 shared_ptr、unique_ptr、weak_ptr、auto_ptr

    c++中的smart pointer四个智能指针 C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr其中后三个是c++11支持,并且第一个 ...

  9. 32. 对c++中的smart pointer四个智能指针shared_ptr,unique_ptr,weak_ptr,auto_ptr的理解

    C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被11弃用. 智能指针的作用是管理一个指针, ...

  10. C++ -- 智能指针 auto_ptr,unique_ptr,shared_ptr的简单实现和原理

    一,为什么需要智能指针 智能指针是一种预防型的内存泄漏的解决方案.由于C++没有垃圾回收器机制,所以每次new出来的资源都需要手动的delete,如果没有手动释放,就会造成资源泄漏等问题.因此,为了避 ...

最新文章

  1. css里calculate,calc() ---一个会计算的css属性
  2. Git《一》简介及安装使用
  3. 数据分析系列剧第四集:行业研究报告与生产计划
  4. 为什么现在又流行服务端渲染html?
  5. Android开源库集合(UI效果)
  6. 165体重_165—185男生标准体重,抓紧健身吧,要不没有女生会喜欢的
  7. 天锐绿盾加密软件支持什么操作系统?
  8. Visual FoxPro已经过时了吗 ?我也经常问自己!
  9. PetaLinux 添加启动后自动执行脚本
  10. php与jpython-在python中复数怎么表示
  11. JS函数传参、作用域
  12. 服务器fps不稳定,FPS不稳定是什么原因?玩游戏FPS低怎么办?
  13. mysql 表名 字段名_MySQL 查询所有数据库名和表名及字段名
  14. html5 main form 结合,web组件之表单(HTML5)
  15. thinkphp6自定义日志驱动,增加显示全部请求信息
  16. Kingbase8开发版,启动提示FATAL: XX000: max_connections should be less than orequal than 10
  17. 使用drbd实现数据的高可用
  18. 如何创建 2023 年营销日历(内含免费模板和示例)
  19. java gzip 压缩解压工具类
  20. 重叠头像最简单实现(RecyclerView实现)

热门文章

  1. Java顺序表就地逆置_顺序表的就地逆置问题
  2. a padding to disable MSIE and Chrome friendly error page解决方案
  3. 如何查询网页游戏服务器记录,如何查询网页游戏服务器记录
  4. java 不是封闭类_java – MainActivity.this不是一个封闭的类AsyncTask
  5. java技术:输入拼音自动提示汉字的方法
  6. 【知乎讨论】如何评价《上海生活垃圾管理条例》中的垃圾分类标准?
  7. 异响加持、吐槽声不断,小鹏G9难解困局
  8. arch检验python_arch效应检验的一些要点
  9. VMWare workstation 在打开虚拟机时出现 Unable to find the VXM binary
  10. V2V-PoseNet:Voxel-to-Voxel Prediction Network for Accurate 3D Hand and Human Pose Estimation from...