锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C++开源 / share_ptr用途和share_ptr难点
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
量化预测
股票离线分析软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容


share_ptr用途和share_ptr难点


share_ptr智能指针的机制类似COM机制,用引用计数来控制是否自动释放,当引用计数为0时释放,不为0时,一直维持生命周期。在多个函数或模块里使用同样内存时考虑使用share_ptr,但如果是全局内存,则不需要share_ptr,如果不是全局内存,用share_ptr会导致耦合,这和软件工程思想是冲突的,所以在httplib里就搜索不到share_ptr,没有使用。

作为几十年的老程序员,对现有平台代码进行优化,还没想到有哪个点能用上share_ptr。或者说是按新标准,一个模块内(不跨线程),以前有关联的同类型指针,都要换成share_ptr,这样在释放时,就方便了。不过这个关联性要程序员自己把握。

在MSDN里,有个例子,对share_ptr的用途讲的好,在数组过滤时,用share_ptr很方便。

vector<shared_ptr<Song>> v {
  make_shared<Song>(L"Bob Dylan", L"The Times They Are A Changing"),
  make_shared<Song>(L"Aretha Franklin", L"Bridge Over Troubled Water"),
  make_shared<Song>(L"Thalía", L"Entre El Mar y Una Estrella")
};

vector<shared_ptr<Song>> v2;
remove_copy_if(v.begin(), v.end(), back_inserter(v2), [] (shared_ptr<Song> s) 
{
    return s->artist.compare(L"Bob Dylan") == 0;
});

for (const auto& s : v2)
{
    wcout << s->artist << L":" << s->title << endl;
}

过滤形式2代码:

vector<shared_ptr<MediaAsset>> assets {
  make_shared<Song>(L"Himesh Reshammiya", L"Tera Surroor"),
  make_shared<Song>(L"Penaz Masani", L"Tu Dil De De"),
  make_shared<Photo>(L"2011-04-06", L"Redmond, WA", L"Soccer field at Microsoft.")
};

vector<shared_ptr<MediaAsset>> photos;

copy_if(assets.begin(), assets.end(), back_inserter(photos), [] (shared_ptr<MediaAsset> p) -> bool
{
    // Use dynamic_pointer_cast to test whether
    // element is a shared_ptr<Photo>.
    shared_ptr<Photo> temp = dynamic_pointer_cast<Photo>(p);
    return temp.get() != nullptr;
});

for (const auto&  p : photos)
{
    // We know that the photos vector contains only 
    // shared_ptr<Photo> objects, so use static_cast.
    wcout << "Photo location: " << (static_pointer_cast<Photo>(p))->location << endl;
}

使用匿名函数配合remove_copy_if或copy_if过滤很方便。

跨线程的情况很复杂,最好不要有耦合。

share_ptr难点也比较多,比如上文说的关联,在标准术语里叫share_ptr组,一个组对应一块原始内存,组之间不能串,串了就出错或异常崩溃了。

share_ptr难点二:循环引用,A类里有B类的share_ptr,而B类有A类的share_ptr,互相引用,就释放不了了。

share_ptr难点三:有时候需要内部内存时,相当于脱离了智能保护,某个位置强制释放了内部内存,则share_ptr也会崩溃。

所以share_ptr智能不是万能,使用C++处理内存,尤其要小心。

友情链接
版权所有 Copyright(c)2004-2024 锐英源软件
统一社会信用代码:91410105098562502G 豫ICP备08007559号 最佳分辨率 1440*900
地址:郑州市金水区文化路97号郑州大学北区院内南门附近