亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ boost scoped_ptr智能指針詳解

 更新時間:2022年11月18日 09:31:14   作者:無水先生  
智能指針是一種像指針的C++對象,但它能夠在對象不使用的時候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個

一、智能指針-唯一所有者

boost::scoped_ptr 是一個智能指針,它是動態(tài)分配對象的唯一所有者。 boost::scoped_ptr 無法復(fù)制或移動。此智能指針在頭文件 boost/scoped_ptr.hpp 中定義。

二、接口類分析

scoped_array 分析

scoped_array 的類部分原始代碼如下:

template<class T> class scoped_array // noncopyable
{
private:
    T * px;
    scoped_array(scoped_array const &);
    scoped_array & operator=(scoped_array const &);
    typedef scoped_array<T> this_type;
    void operator==( scoped_array const& ) const;
    void operator!=( scoped_array const& ) const;
public:
    typedef T element_type;
    explicit scoped_array( T * p = 0 ) BOOST_SP_NOEXCEPT : px( p )
    {
    }
    ~scoped_array() // never throws
    {
        boost::checked_array_delete( px );
    }
    void reset(T * p = 0) // never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT)
    {
        BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors
        this_type(p).swap(*this);
    }
    T & operator[](std::ptrdiff_t i) const // never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT)
    {
        BOOST_ASSERT( px != 0 );
        BOOST_ASSERT( i >= 0 );
        return px[i];
    }
    T * get() const BOOST_NOEXCEPT
    {
        return px;
    }
// implicit conversion to "bool"
#include <boost/smart_ptr/detail/operator_bool.hpp>
    void swap(scoped_array & b) BOOST_NOEXCEPT
    {
        T * tmp = b.px;
        b.px = px;
        px = tmp;
    }
};

從源碼上可以看出scoped_array 的接口和功能幾乎與scoped_ptr 是相同的,這里我們就不重復(fù)說明。需要的可以參考 boost::scoped_ptr智能指針。

示例 1.1.如何用boost::scoped_ptr

#include <boost/scoped_ptr.hpp>
#include <iostream>
int main()
{
  boost::scoped_ptr<int> p{new int{1}};
  std::cout << *p << '\n';
  p.reset(new int{2});
  std::cout << *p.get() << '\n';
  p.reset();
  std::cout << std::boolalpha << static_cast<bool>(p) << '\n';
}

參考結(jié)果

boost::scoped_ptr 類型的智能指針不能轉(zhuǎn)移對象的所有權(quán)。使用地址初始化后,動態(tài)分配的對象會在執(zhí)行析構(gòu)函數(shù)或調(diào)用成員函數(shù) reset() 時釋放。

示例 1.1 使用類型為 boost::scoped_ptr<int> 的智能指針 p。 p 使用指向存儲數(shù)字 1 的動態(tài)分配對象的指針進行初始化。通過運算符 *,p 被取出引用并將 1 寫入標準輸出。

使用 reset() 可以將新地址存儲在智能指針中。這樣,示例將包含數(shù)字 2 的新分配的 int 對象的地址傳遞給 p。通過調(diào)用 reset(),p 中當(dāng)前引用的對象會被自動銷毀。

get() 返回錨定在智能指針中的對象的地址。該示例取消引用 get() 返回的地址以將 2 寫入標準輸出。

boost::scoped_ptr 重載操作符 operator bool。如果智能指針包含對對象的引用(也就是說,如果它不為空),則 operator bool 返回 true。該示例將 false 寫入標準輸出,因為 p 已通過調(diào)用 reset() 重置。

boost::scoped_ptr 的析構(gòu)函數(shù)通過 delete 釋放引用的對象。這就是為什么 boost::scoped_ptr 不能用動態(tài)分配的數(shù)組的地址來初始化,必須用 delete[] 來釋放。對于數(shù)組,Boost.SmartPointers 提供了 boost::scoped_array 類。

示例 1.2.應(yīng)用boost::scoped_array

#include <boost/scoped_array.hpp>
int main()
{
  boost::scoped_array<int> p{new int[2]};
  *p.get() = 1;
  p[1] = 2;
  p.reset(new int[3]);
}

智能指針 boost::scoped_array 的使用與 boost::scoped_ptr 類似。關(guān)鍵的區(qū)別在于 boost::scoped_array 的析構(gòu)函數(shù)使用操作符 delete[] 來釋放包含的對象。由于此運算符僅適用于數(shù)組,因此 boost::scoped_array 必須使用動態(tài)分配的數(shù)組的地址進行初始化。

boost::scoped_array 在 boost/scoped_array.hpp 中定義。

boost::scoped_array 為 operator[] 和 operator bool 提供重載。使用 operator[],可以訪問數(shù)組的特定元素。因此,boost::scoped_array 類型的對象的行為類似于它所擁有的數(shù)組。示例 1.2 將數(shù)字 2 保存為 p 引用的數(shù)組中的第二個元素。

與 boost::scoped_ptr 一樣,提供了成員函數(shù) get() 和 reset() 來檢索和重新初始化所包含對象的地址。

到此這篇關(guān)于C++ boost scoped_ptr智能指針詳解的文章就介紹到這了,更多相關(guān)C++ boost scoped_ptr內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 命名空間詳解

    C++ 命名空間詳解

    這篇文章主要介紹了C++ 命名空間的的相關(guān)資料,文中示例代碼非常詳細,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2021-11-11
  • C++實現(xiàn)bmp格式圖像讀寫

    C++實現(xiàn)bmp格式圖像讀寫

    這篇文章主要為大家詳細介紹了C++實現(xiàn)bmp格式圖像讀寫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • c++中的string常用函數(shù)用法總結(jié)

    c++中的string常用函數(shù)用法總結(jié)

    以下是對c++中的string常用函數(shù)的用法進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • VC++ 字符串String MD5計算小工具 VS2008工程

    VC++ 字符串String MD5計算小工具 VS2008工程

    基于字符串加密的MD5算法,VS2008 VC++,多字節(jié)編譯工程。主要代碼如下,實現(xiàn)了ANSI字符串加密與Unicode字符串加密,需要的朋友可以參考下
    2017-07-07
  • C++?OpenCV實現(xiàn)物體尺寸測量示例詳解

    C++?OpenCV實現(xiàn)物體尺寸測量示例詳解

    本文主要介紹了利用OpenCV對物體的尺寸進行測量,即先定位到待測物體的位置,然后測量物體的寬高。感興趣的同學(xué)可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2022-01-01
  • c++從函數(shù)返回數(shù)組的方法代碼

    c++從函數(shù)返回數(shù)組的方法代碼

    在本篇文章里小編給大家整理的是關(guān)于c++從函數(shù)返回數(shù)組的方法代碼,有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • C++應(yīng)用實現(xiàn)簡易五子棋游戲

    C++應(yīng)用實現(xiàn)簡易五子棋游戲

    這篇文章主要為大家詳細介紹了C++應(yīng)用實現(xiàn)簡易五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • iostream與iostream.h的區(qū)別詳細解析

    iostream與iostream.h的區(qū)別詳細解析

    以下是對C++中iostream與iostream.h的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • C++如何將運行結(jié)果保存到txt中

    C++如何將運行結(jié)果保存到txt中

    這篇文章主要介紹了C++如何將運行結(jié)果保存到txt中問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 一文帶你掌握C語言中的文件操作

    一文帶你掌握C語言中的文件操作

    文件通常是駐留在外部介質(zhì)(如磁盤等)上的,在使用時才調(diào)入內(nèi)存中來,本文主要來和大家介紹一下C語言中的文件操作,有需要的可以了解下
    2024-02-02

最新評論