设为首页 加入收藏

TOP

C++ - "shared_ptr"的使用方法 及 代码
2015-11-21 01:53:06 来源: 作者: 【 】 浏览:5
Tags:" shared_ptr" 使用方法 代码
"shared_ptr"的使用方法 及 代码
?
智能指针(smart pointer)是C++11的新特性. 指针在无人使用时, 自动释放动态内存.
通过"use_count"计数, 并判断是否无人使用, 从而释放内存.
在函数复制(copy)过程中, 默认copy方法是引用相同的潜在元素.
如下代码, b1和b2共享元素, 如果范围结束({}), 则b2释放, b1则没有元素, 为了保持b1中的元素, 而使用动态内存.
由于VS2012很多C++11特性无法支持, 所以在Eclipse CDT上进行测试(GCC4.8.1).
代码(Eclipse CDT)如下, 注意b1的元素个数, 以及shared_pointer的使用数(use_count):
?
/* 
 * CppPrimer.cpp 
 * 
 *  Created on: 2013.11.2 
 *      Author: C.L.Wang 
 */  
  
/*eclipse cdt*/  
  
#include   
  
#include   
#include   
#include   
  
#include   
  
#include   
  
using namespace std;  
  
class StrBlob {  
    public:  
        typedef std::vector::size_type size_type;  
        StrBlob();  
        StrBlob(std::initializer_list il);  
        size_type size() const{ return data->size(); }  
        bool empty() const { return data->empty(); }  
        void push_back(const std::string& t) { data->push_back(t); }  
        void pop_back();  
        std::string& front() ;  
        std::string& back() ;  
        std::shared_ptr > data; //test  
    private:  
        //std::shared_ptr > data;  
        void check(size_type i, const std::string &msg) const;  
};  
  
StrBlob::StrBlob():data(std::make_shared>()) {}  
StrBlob::StrBlob(std::initializer_list il):  
        data(std::make_shared< std::vector >(il)) {}  
void StrBlob::check(size_type i, const std::string &msg) const {  
    if(i >= data->size())  
        throw out_of_range(msg);  
}  
std::string& StrBlob::front () {  
    check(0, "front on empty StrBlob");  
    return data->front();  
}  
std::string& StrBlob::back () {  
    check(0, "back on empty StrBlob");  
    return data->back();  
}  
void StrBlob::pop_back () {  
    check(0, "pop_back on empty StrBlob");  
    data->pop_back();  
}  
int main (void) {  
    StrBlob b1;  
    //{}释放b2  
    {  
        StrBlob b2 = {"a", "an", "the"};  
        b1 = b2;  
        b2.push_back("about");  
    }  
    std::cout << "b1 size = " << b1.size() << std::endl;  
    std::cout << "b1 data use count = " << b1.data.use_count() << std::endl;  
    //b2已经被释放了  
    //std::cout << "b2 size = " << b2.size() << std::endl;  
    return 0;  
}  

?

?
输出:
b1 size = 4
b1 data use count = 2
?
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 2965 The Pilots Brothers.. 下一篇UVa 10881 Piotr's Ants

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: