精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容
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++处理内存,尤其要小心。