中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

shared_array

發布時間:2020-06-28 11:00:51 來源:網絡 閱讀:594 作者:匯天下豪杰 欄目:編程語言

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)、所管理的空間是死的,不能夠自動增長。




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

日喀则市| 大埔县| 西林县| 墨竹工卡县| 绥德县| 衡阳县| 乐清市| 两当县| 瑞丽市| 万全县| 灌阳县| 镇沅| 南雄市| 沧州市| 梁山县| 彭州市| 邢台县| 阜阳市| 万宁市| 册亨县| 呈贡县| 通江县| 邛崃市| 武平县| 阿拉善左旗| 沂源县| 红桥区| 沙湾县| 连州市| 彩票| 神木县| 吉安市| 彭阳县| 防城港市| 星子县| 喜德县| 永清县| 安陆市| 元朗区| 建阳市| 乐清市|