zoukankan      html  css  js  c++  java
  • 正确地使用智能指针

    C++没有像Java和C#那样存在自动内存回收机制,因此C++的内存管理是每一个C++程序员都要面对的问题。所幸的是,C++提供了智能指针这一机制来帮助我们自动地管理内存分配,大大方便了内存管理。

    C++提供了两种智能指针:auto_ptr和shared_ptr,这两种类型都具备自动管理内存资源的功能。当智能指针离开作用域的时候,其指向的内存区块会被自动销毁,防止内存泄漏问题。

    对于auto_ptr,注意一定不要让多个auto_ptr同时指向同一对象!它有一个不寻常的性质:若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权!

    #include <iostream>
    #include <memory>
    int main()
    {
    	int* x=new int;
    	std::auto_ptr<int> sp(x);//now sp points to x
    	std::auto_ptr<int> sp2=sp;//now sp2 points to x,sp is null
    	return 0;
    }

    这种赋值方式明显是很不自然的,因此我们可以通过shared_ptr来管理指针。多个shared_ptr对象可以指向同一个指针,当最后一个指向该指针的shared_ptr对象不再指向它之后,该区域内存就会被自动销毁。

    #include <iostream>
    #include <memory>
    int main()
    {
    	int* x=new int;
    	std::tr1::shared_ptr<int> sp(x);//now sp points to x
    	std::tr1::shared_ptr<int> sp2=sp;//now sp2 points to x,sp as well
    	return 0;
    }
    

    需要注意的是,无论是auto_str还是shared_str,其销毁内存的函数都是delete而不是delete[]。也就是说,如下用法会导致内存泄露:

    std::tr1::shared_ptr<int> sp(new int[5]);
    

    但这样是可以通过编译的,因此这是使用智能指针需要注意的一点。

  • 相关阅读:
    FactoryBean的作用
    ztree点击文字勾选checkbox,radio实现方法
    js判断字符长度 汉字算两个字符
    双系统引导修复
    thinkpadT440p
    分布式服务器集群
    Eclipse插件安装方式
    用SourceTree轻巧Git项目图解
    廖雪峰git使用完整教程
    hessian
  • 原文地址:https://www.cnblogs.com/wickedpriest/p/5610397.html
Copyright © 2011-2022 走看看