智能指針原理,boost智能指針

 2023-11-10 阅读 21 评论 0

摘要:一.安裝boost 1.首先去下載最新的boost代碼包,網址www.boost.org 2.進入到自己的目錄,解壓: ? ?bzip2 -d boost_1_64_0.tar.bz2 ? ? tar -zxvf boost_1_64_0.tar.gz3.之后進入boost目錄 cd boost_1_64_0/ ./bootstrap.sh之后會產生bjam和b2兩個工具 sudo

一.安裝boost

1.首先去下載最新的boost代碼包,網址www.boost.org

2.進入到自己的目錄,解壓:

? ?bzip2 -d boost_1_64_0.tar.bz2
? ? tar -zxvf boost_1_64_0.tar.gz
3.之后進入boost目錄
cd boost_1_64_0/
./bootstrap.sh之后會產生bjam和b2兩個工具
sudo ./b2 install(確定已經安裝了g++與gcc,此過程會花費一些時間)
這個時候你的/usr/local/include下會產生boost的頭文件,
/usr/local/lib下面會產生boost庫
4.切換到cd /etc/profile.d目錄下,使用超級用戶創建文件boost.sh
里面添加如下內容
#!/bin/sh
BOOST_ROOT=/home/liuqi/boost_1_64_0(boost的解壓路徑)
BOOST_INCLUDE=/usr/local/include/boost
BOOST_LIB=/usr/local/lib
export BOOST_INCLUDE BOOST_LIB BOOST_ROOT
修改boost.sh的權限 sudo chmod +x boost.sh,執行./boost.sh

智能指針原理?export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

可以在?~/.bashrc?或者?~/.bash_profile?中加入 export 語句
5.至此,安裝完畢,測試代碼

二.智能指針

1.智能指針是利用RAII(Resource Acquistion Is Initialization:資源獲取即初始化)來管理資源

2.智能指針本質思想:

erase一個智能指針、(1)將堆對象的生存期用棧對象(智能指針)來管理,當new一個堆對象的時候,立刻用智能指針來接管,具體做法是在構造函數進行初始化(用一個指針指向堆對象),在析構 函數中調用delete來釋放堆對象;(2)由于智能指針本身是一個棧對象,它的作用域結束的時候,自動調用析構函數,從而調用delete釋放了堆對象。

三.shared_ptr

1.shared_ptr內部維護一個引用計數器來判斷此指針是不是需要被釋放,線程安全https://blog.csdn.net/INGNIGHT/article/details/99881762=

#include <iostream>
#include <boost/shared_ptr.hpp>
using namespace std;class X {
public:X() {cout << "X" << endl;}~X() {cout << "~X" << endl;}};int main() {boost::shared_ptr<X> p1(new X);cout << p1.use_count() << endl; //1boost::shared_ptr<X> p2(p1);cout << p2.use_count() << endl;  //2p1.reset();cout << p2.use_count() << endl;  //1p2.reset();cout << p2.use_count() << endl;  //0boost::shared_ptr<X> p3;p3 = p2;cout << p2.use_count() << endl;  //0cout << p3.use_count() << endl;  //0return 0;
}

2.避免使用匿名的臨時shared_ptr<T>對象(Effective C++中寫道)

void f(shared_ptr<int>, int);
int g();
void ok()
{shared_ptr<int> p(new int(2));f(p,g());
}
void bad)()
{f(shared_ptr<int>(new int(2)),g());	
}

boost5.0,3.shared_ptr可以作為容器成員

#include <iostream>
#include <memory>
#include <vector>
#include <boost/shared_ptr.hpp>using namespace std;class X {
public:X() {cout << "X" << endl;}~X() {cout << "~X" << endl;}};int main() {//auto_ptr不能作為容器成員//vector<auto_ptr<X>> v;//auto_ptr<X> p(new X);//v.push_back(p);  //Errorvector<boost::shared_ptr<X>> v2;boost::shared_ptr<X> p2 = boost::shared_ptr<X>(new X);cout << p2.use_count() << endl;  //1v2.push_back(p2);cout << p2.use_count() << endl; //2return 0;
}

4.仿寫shared_ptr 見地址?http://blog.csdn.net/ingnight/article/details/50651441

四.weak_ptr

1.(1)強引用,只要有一個引用存在,對象就不能釋放

? ?(2)弱引用,并不增加的引用計數,但它能知道對象是否存在

智能指針和普通指針。? ? ? ? ? ? 【1】如果存在,提升shared_ptr(強調用)成功

? ? ? ? ? ? 【2】如果不存在,提升失敗

? ? (3)通過weak_ptr訪問對象的成員時候,要提升為shared_ptr

? ? (4)weak_ptr<T>弱指針,它不控制對象的生命周期,但是它要知道對象是都還活著。如果對象活著,那么它可以提升(promote)為有效的shared_ptr;如果對象已經死了,提升失敗,返回一個空的shared_ptr

智能指針線程安全。2.解決循環引用

#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
using namespace std;class Parent;
class Child;
typedef boost::shared_ptr<Parent> parent_ptr;
typedef boost::shared_ptr<Child> child_ptr;class Parent {
public:Parent() {cout << "Parent()" << endl;}~Parent() {cout << "~Parent()" << endl;}
public:boost::weak_ptr<Child> child_;
};class Child {
public:Child() {cout << "Child()" << endl;}~Child() {cout << "~Child()" << endl;}
public:parent_ptr parent_;
};int main() {parent_ptr parent(new Parent);child_ptr child(new Child);parent->child_ = child;child->parent_ = parent;//parent->child_.reset();return 0;
}

?

3.

#include <iostream>
#include <boost/weak_ptr.hpp>
#include <boost/scoped_array.hpp>using namespace std;class X{
public:X() {	cout << "X..." << endl;}~X() {	cout << "~X..." << endl;}
public:void Fun() {cout << "X::Fun()" << endl;	}
};int main() {boost::weak_ptr<X> p;{boost::shared_ptr<X> p2(new X);cout << p2.use_count() << endl;  // 1	p = p2;cout << p2.use_count() << endl;  // 1	boost::shared_ptr<X> p3 = p.lock();cout << p3.use_count() << endl;  // 2if(!p3) {cout << "objec is destoryed" << endl;}else {p3->Fun();}}boost::shared_ptr<X> p4 = p.lock();if(!p4) {cout << "objec is destoryed" << endl;}else {p4->Fun();}boost::scoped_array<X> xx(new X[3]);	return 0;
}

阿迪科技boost??

五.shared_array/scoped_array

?

shared_array<X> arr(new X[4])

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/169701.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息