shared_array

1、上次写的删除器有些问题:

template<class P, class D>
class sp_counted_impl_pd : public sp_counted_base{
public:
    sp_counted_impl_pd(P p, D d) : ptr(p), del(d){}
public:
    void dispose(){
        del(ptr);  //就是这里,将对象用作函数!!!
    }
private:
    P ptr;
    D del;
};

del(ptr)  -> del.operator()(ptr);重载了()的类使用起来就是函数对象
删除器:函数对象和函数都可以充当。

2、shared_array

它和shared_ptr类似,它包装了new[]操作符在堆上分配的动态数组,也是采用了引用计数的机制。

shared_array的接口和功能与shared_ptr几乎是相同的,主要区别:

(1)、接受指针p必须是new []的结果

(2)、提供operator[]的重载,可以使用下标

(3)、系统没有提供*、->的重载

(4)、析构函数使用delete  [];

3、如何使用shared_array

系统调用:

#include<iostream>
#include<boost/smart_ptr.hpp>
using namespace std;
using namespace boost;

int main(void){
    int *p = new int[10];
    shared_array<int> pa(p);  //共享数组

    for(int i = 0; i < 10; i++){
        pa[i] = i+1;  //系统内进行了[]的重载
    }
    for(i = 0; i < 10; i++){
        cout<<pa[i]<<" ";
    }
    cout<<endl;

}

4、shared_array

模仿的源码如下:

#ifndef _SHARED_ARRAY_H_
#define _SHARED_ARRAY_H_

#include"checked_delete.h"

template<class T>
class shared_array{
public:
    typedef checked_array_deleter<T> deleter;
    shared_array(T *p = 0) : px(p), pn(p, deleter()){} //无名对象
    ~shared_array(){
        
    }
public:
    T& operator[](int i)const{
        return px[i];
    }
private:
    T *px;
    shared_count pn;  //必须用到引用计数器对象
};

#endif
///////////////////////////////////////////////////////////////////////////////////////////
#ifndef _CHECKED_DELETE_H_
#define _CHECKED_DELETE_H_

template<class T>
void checked_array_delete(T *x){
    delete []x;
}

template<class T>
struct checked_array_deleter{
public:
    void operator()(T *x)const{
        checked_array_delete(x);        
    }
};

#endif
/////////////////////////////////////////////////////////////////////////////////////////////
#include<iostream>
#include"shared_ptr.h"
#include"shared_array.h"
using namespace std;
/*
template<class T>
void checked_array_delete(T *x){
    delete []x;
}

template<class T>
struct checked_array_deleter{
public:
    void operator()(T *x)const{
        checked_array_delete(x);        
    }
};
写好()的重载之后,就是在shared_counted.h中释放空间时将用到。
del(ptr)  -> del.operator()(ptr);重载了()的类使用起来就是函数对象
删除器:函数对象和函数都可以充当。
*/
int main(void){
    int *p = new int[10];
    shared_array<int> pa(p);

    for(int i = 0; i < 10; i++){
        pa[i] = i+1;
    }
    for(i = 0; i < 10; i++){
        cout<<pa[i]<<" ";
    }
    cout<<endl;
}

缺点:(1)、重载使用[]时要小心,shared_array不提供数组的索引范围检查

(2)、所管理的空间是死的,不能够自动增长。

时间: 2024-10-15 21:58:33

shared_array的相关文章

#include &lt;boost/shared_array.hpp&gt;

共享数组 共享数组的行为类型于共享指针.关键不同在于共享数组在析构时,默认使用delete[]操作符来释放所含的对象.因为这个操作符只能用于数组对象,共享数组必须通过动态分配的数组的地址来初始化.共享数组对应的类型是boost::shared_array,它的定义在boost/shared_array.hpp里. 1 #include <iostream> 2 #include <boost/shared_array.hpp> 3 4 class runclass 5 { 6 pu

boost智能指针使用

#include <iostream> #include <tr1/memory> #include <boost/scoped_ptr.hpp> //scoped_ptr还不属于tr1 #include <boost/scoped_array.hpp> //scored_array也不属于tr1 #include <boost/shared_array.hpp> //shared_array也不属于tr1 class CTest { publi

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

浅谈RAII&智能指针

关于RAII,官方给出的解释是这样的"资源获取就是初始化".听起来貌似不是很懂的哈,其实说的通俗点的话就是它是一种管理资源,避免内存泄漏的一种方法.它可以保证在各种情况下,当你对对象进行使用时先通过构造函数来进行资源的分配和初始化,最后通过析构函数来进行清理,有效的保证了资源的正确分配和释放.(特别是在异常中,因为异常往往会改变代码正确的执行顺序,这就很容易引起资源管理的混乱和内存的泄漏) 其中智能指针就是RAII的一种实现模式,所谓的智能就是它可以自动化的来管理它所指向那份空间的资源

智能指针的模拟实现 auto_ptr scoped_ptr shared_ptr

RAII(Resource Acquisition Is Initialization) 资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 智能指针:用自动化或者说智能的指针来实现对动态内存的释放.它是一个类,有类似指针的功能. 常见的智能指针:auto_ptr/scoped_ptr/scoped_array/shared_ptr/shared_array,由于scoped_array和scoped_

C++ 智能指针

本文转自: http://blog.csdn.net/xt_xiaotian/article/details/5714477 (纯属自学转载) 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::sco

&lt;Effective C++&gt;读书摘要--Resource Management&lt;一&gt;

1.除了内存资源以外,Other common resources include file descriptors, mutex locks, fonts and brushes in graphical user interfaces (GUIs), database connections, and network sockets. Regardless of the resource, it's important that it be released when you're fini

《Effective C++》资源管理:条款13-条款15

在系统中,资源是有限的,一旦用完必须归还给系统,否则可能会造成资源耗尽或其他问题.例如,动态分配的内存如果用完不释放会造成内存泄漏. 这里说的资源不仅仅是指内存,还包括其他,例如文件描述符.网络连接.数据库连接.互斥锁等. 在任何情况下都要把不使用的资源归还系统是一件非常困难的事情.尤其是考虑到异常.函数内多重回传路径等. 基于对象的资源管理办法几乎可以消除资源管理的问题.下面介绍的方法也可以弥补一些不足. 条款13:以对象管理资源 现在假设用一个类来模拟投资行为,各种投资类都继承自一个基类In