国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++入門到精通】智能指針 auto_ptr、unique_ptr簡介及C++模擬實現(xiàn) [ C++入門 ]

這篇具有很好參考價值的文章主要介紹了【C++入門到精通】智能指針 auto_ptr、unique_ptr簡介及C++模擬實現(xiàn) [ C++入門 ]。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【C++入門到精通】智能指針 auto_ptr、unique_ptr簡介及C++模擬實現(xiàn) [ C++入門 ],C++,c++,開發(fā)語言

引言

在 C++ 中,智能指針是一種非常重要的概念,它能夠幫助我們自動管理動態(tài)分配的內存,避免出現(xiàn)內存泄漏等問題。在上一篇文章中,我們了解了智能指針的基本概念和原理,本篇文章將繼續(xù)介紹 auto_ptrunique_ptr 兩種智能指針的概念及其在 C++ 中的模擬實現(xiàn)。通過學習這些內容,您將更好地理解智能指針的不同類型和使用場景,進一步提高程序的安全性和可靠性。讓我們一起探索C++智能指針的精彩世界!

一、std::auto_ptr

??std::auto_ptr官方文檔
【C++入門到精通】智能指針 auto_ptr、unique_ptr簡介及C++模擬實現(xiàn) [ C++入門 ],C++,c++,開發(fā)語言

1. 簡介

std::auto_ptr 是 C++ 標準庫中提供的一種智能指針類型,用于管理動態(tài)分配的內存資源。

std::auto_ptr 的主要特點是擁有所有權語義的轉移。當一個 auto_ptr 對象擁有某個內存資源時,它可以將這個所有權轉移給另一個 auto_ptr 對象。這意味著當一個 auto_ptr 對象被賦值給另一個 auto_ptr 對象或者被傳遞給一個函數(shù)時,原來的 auto_ptr 對象將不再擁有該資源,而是轉移到了新的對象上。

std::auto_ptr 類的定義在 <memory> 頭文件中。使用 auto_ptr 需要包含該頭文件,并使用 std 命名空間。

2. 使用示例

?我們可以使用 auto_ptr 來管理動態(tài)分配的整型對象:

#include <iostream>
#include <memory>

int main() {
    std::auto_ptr<int> ptr(new int(42));
    
    std::cout << *ptr << std::endl;  // 輸出:42
    
    std::auto_ptr<int> ptr2 = ptr;  // 所有權轉移
    
    std::cout << *ptr2 << std::endl;  // 輸出:42
    // std::cout << *ptr << std::endl;  // 錯誤!ptr 不再擁有資源

    return 0;
}

????注意當一個 auto_ptr 對象轉移所有權后,原來的對象將變?yōu)橐粋€空指針。這可能導致程序出現(xiàn)意外的行為,因此需要謹慎使用。此外,std::auto_ptr 并不支持數(shù)組類型的內存資源管理,它只適用于單個對象。如果需要管理動態(tài)分配的數(shù)組,應該使用其他智能指針類型,如 std::unique_ptrstd::shared_ptr

總之,std::auto_ptr 是 C++ 標準庫中提供的一種智能指針類型,具有所有權轉移的特性。然而,由于其存在一些潛在的問題,已經在 C++17 中被廢棄,推薦使用更先進的智能指針類型來代替。

3. C++模擬實現(xiàn)

template<class T>
class auto_ptr
{
public:
    // 構造函數(shù),接受一個指向動態(tài)分配的資源的指針
    auto_ptr(T* ptr)
        : _ptr(ptr)
    {}

    // 析構函數(shù),在對象銷毀時釋放資源
    ~auto_ptr()
    {
        if (_ptr)
        {
            cout << "delete:" << _ptr << endl;
            delete _ptr;
        }
    }

    // 拷貝構造函數(shù),用于管理權轉移
    auto_ptr(auto_ptr<T>& ap)
        : _ptr(ap._ptr)
    {
        ap._ptr = nullptr;
    }

    // 解引用操作符,返回所管理資源的引用
    T& operator*()
    {
        return *_ptr;
    }

    // 成員訪問操作符,返回所管理資源的指針
    T* operator->()
    {
        return _ptr;
    }
private:
    T* _ptr;  // 指向動態(tài)分配的資源的指針
};

這段代碼是一個簡化版的 auto_ptr 類的實現(xiàn),用于演示 auto_ptr 的基本工作原理。它是一個模板類,可以管理任意類型的動態(tài)分配的內存資源。

?該類包含了以下成員函數(shù)和成員變量:

  • 構造函數(shù):接受一個指向動態(tài)分配的資源的指針,并將其存儲在私有成員變量 _ptr 中。
  • 析構函數(shù):在對象銷毀時釋放資源,即調用 delete 操作符刪除 _ptr 指向的內存。
  • 拷貝構造函數(shù):用于管理權轉移,將另一個 auto_ptr 對象的資源轉移到當前對象中,并將原對象的指針置為空。
  • operator*:用于解引用 auto_ptr 對象,返回所管理資源的引用。
  • operator->:用于訪問 auto_ptr 所管理資源的成員。

????再次提醒當一個 auto_ptr 對象轉移所有權后,原來的對象將變?yōu)橐粋€空指針。這可能導致程序出現(xiàn)意外的行為,因此需要謹慎使用。

二、std::unique_ptr

??std::unique_ptr官方文檔
【C++入門到精通】智能指針 auto_ptr、unique_ptr簡介及C++模擬實現(xiàn) [ C++入門 ],C++,c++,開發(fā)語言

1. 簡介

std::unique_ptr 是 C++11 中引入的一種智能指針,它是一個輕量級的、不可拷貝的指針類型。與傳統(tǒng)的裸指針不同,std::unique_ptr 通過 RAII 的方式來管理動態(tài)分配的內存資源,從而實現(xiàn)自動資源釋放和防止內存泄漏

使用 std::unique_ptr 可以避免手動管理動態(tài)分配的內存資源,因為 std::unique_ptr 自身就擁有資源的所有權,當 std::unique_ptr 被銷毀時,它所管理的資源也會被自動釋放。這使得代碼更加簡潔、安全和易于維護。

std::unique_ptr 有以下幾個主要特點:

  1. 不支持拷貝和賦值操作,即不能直接復制或賦值一個 std::unique_ptr 對象,只能通過移動語義或者 std::move 函數(shù)來轉移資源的所有權;
  2. 在默認情況下,std::unique_ptr 使用 delete 操作符來釋放所管理的資源,但也可以通過自定義刪除器來實現(xiàn)對資源的自定義釋放操作;
  3. 支持使用 lambda 表達式來實現(xiàn)自定義刪除器,從而更加靈活地管理資源。

2. 使用示例

下面是一個簡單的示例,演示了 std::unique_ptr 的基本使用方法:

#include <iostream>
#include <memory>

int main()
{
    // 使用 std::unique_ptr 來管理動態(tài)分配的 int 類型對象
    std::unique_ptr<int> uptr(new int(42));

    // 解引用操作符,返回所管理資源的引用
    std::cout << *uptr << std::endl;

    // 成員訪問操作符,返回所管理資源的指針
    int* p = uptr.get();
    std::cout << *p << std::endl;

    // 試圖復制或賦值 unique_ptr 對象會編譯錯誤
    // std::unique_ptr<int> uptr2 = uptr; // Error

    // 轉移資源所有權
    std::unique_ptr<int> uptr2 = std::move(uptr);
    std::cout << *uptr2 << std::endl;

    return 0;
}

?輸出結果為

42
42
42

????注意:由于 std::unique_ptr 是一個模板類,可以管理任意類型的動態(tài)分配的內存資源,因此使用時需要顯式指定模板參數(shù)。另外,對于數(shù)組的動態(tài)分配內存資源的管理,建議使用 std::unique_ptr 的數(shù)組版本 std::unique_ptr<T[]>。

3. C++模擬實現(xiàn)

template<class T>
class unique_ptr
{
public:
    // 構造函數(shù),接受一個裸指針作為參數(shù)
    unique_ptr(T* ptr)
        :_ptr(ptr)
    {}

    // 析構函數(shù),釋放資源
    ~unique_ptr()
    {
        if (_ptr)
        {
            cout << "delete:" << _ptr << endl;
            delete _ptr;
        }
    }

    // 重載解引用操作符,返回資源的引用
    T& operator*()
    {
        return *_ptr;
    }

    // 重載成員訪問操作符,返回資源的指針
    T* operator->()
    {
        return _ptr;
    }

    // 防止拷貝和賦值
    // C++11思路:直接將拷貝構造函數(shù)和賦值運算符聲明為刪除函數(shù)
    unique_ptr(const unique_ptr<T>& up) = delete;
    unique_ptr<T>& operator=(const unique_ptr<T>& up) = delete;

    // 防止拷貝和賦值
    // C++98思路:只聲明不實現(xiàn),但是用的人可能會在外部強行定義,所以再加一條,聲明為私有
    // private:
    // unique_ptr(const unique_ptr<T>& up);
    // unique_ptr<T>& operator=(const unique_ptr<T>& up);

private:
    T* _ptr;
};

??這段代碼實現(xiàn)了一個簡化版的 unique_ptr 類,具有管理動態(tài)資源的能力,并防止了拷貝和賦值操作。注釋中詳細解釋了每個函數(shù)的作用和實現(xiàn)原理,以及兩種防止拷貝和賦值的方式(C++11 和 C++98 思路)。

溫馨提示

感謝您對博主文章的關注與支持!另外,我計劃在未來的更新中持續(xù)探討與本文相關的內容,會為您帶來更多關于C++以及編程技術問題的深入解析、應用案例和趣味玩法等。請繼續(xù)關注博主的更新,不要錯過任何精彩內容!

再次感謝您的支持和關注。期待與您建立更緊密的互動,共同探索C++、算法和編程的奧秘。祝您生活愉快,排便順暢!
【C++入門到精通】智能指針 auto_ptr、unique_ptr簡介及C++模擬實現(xiàn) [ C++入門 ],C++,c++,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-804154.html

到了這里,關于【C++入門到精通】智能指針 auto_ptr、unique_ptr簡介及C++模擬實現(xiàn) [ C++入門 ]的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • C++11 新特性 ⑥ | 智能指針 unique_ptr、shared_ptr 和 weak_ptr

    目錄 1、引言 2、unique_ptr 3、shared_ptr 4、weak_ptr 5、shared_ptr循環(huán)引用問題(面試題)

    2024年02月09日
    瀏覽(27)
  • C++11中的智能指針unique_ptr、shared_ptr和weak_ptr詳解

    C++11中的智能指針unique_ptr、shared_ptr和weak_ptr詳解

    目錄 1、引言 2、什么是智能指針? 3、在Visual Studio中查看智能指針的源碼實現(xiàn) 4、獨占式指針unique_ptr 4.1、查看unique_ptr的源碼實現(xiàn)片段 4.2、為什么unique_ptr的拷貝構造函數(shù)和復制函數(shù)被delete了?(面試題) 4.3、使用unique_ptr獨占式智能指針的實例 5、共享式指針shared_ptr? 5.1、查

    2024年02月08日
    瀏覽(19)
  • C++11補充:智能指針如std::unique_ptr如何添加自定義的deleter

    關于智能指針的問題,有時候為了方便,需要在析構時附加一些清理操作,或者,有的指針本身來自C的庫文件中,這時候,就非常期望能夠使用自定義的deleter, 但是標準C++創(chuàng)建函數(shù)如std::make_unique / std::make_shared 等不支持創(chuàng)建帶有自定義deleter的智能指針,這時,我們只能使用

    2024年02月07日
    瀏覽(22)
  • 【C++入門到精通】智能指針 [ C++入門 ]

    【C++入門到精通】智能指針 [ C++入門 ]

    在C++編程中,內存管理一直是一個重要的話題。手動分配和釋放內存可能會導致各種問題,例如內存泄漏和懸掛指針,這些問題往往會導致程序崩潰或產生不可預測的結果。為了解決這些問題, C++提供了一種稱為智能指針的機制,它可以自動管理內存分配和釋放,從而避免了

    2024年01月21日
    瀏覽(22)
  • C++智能指針shared_ptr詳解

    C++智能指針shared_ptr詳解

    C++智能指針shared_ptr是一種可以自動管理內存的智能指針,它是C++11新增的特性之一。與傳統(tǒng)指針不同,shared_ptr可以自動釋放所管理的動態(tài)分配對象的內存,并避免了手動釋放內存的繁瑣操作,從而減少了內存泄漏和野指針的出現(xiàn)。 shared_ptr是一個模板類,通過引用計數(shù)器實現(xiàn)

    2023年04月22日
    瀏覽(31)
  • C++智能指針shared_ptr用法

    C++智能指針shared_ptr用法

    寫在前面的總結: 一個shared_ptr對象管理一個指針(new T,在堆空間),多個shared_ptr對象可以管理同一個指針,只有某個shared_ptr對象第一次初始化指針時才執(zhí)行指針的構造函數(shù),管理同一個指針的shared_ptr對象個數(shù)稱為引用計數(shù),這個引用計數(shù)保存在每個管理該指針的shared_p

    2024年02月03日
    瀏覽(20)
  • C++智能指針shared_ptr使用詳解

    shared_ptr 是一個共享所有權的智能指針,允許多個指針指向同一個對象。 ? shared_ptr 使用 引用計數(shù) ,每一個shared_ptr的拷貝都指向相同的內存。每使用它一次,內部的引用計數(shù)加1,每析構一次,內部的引用計數(shù)減1,減為0時,釋放所指向的堆內存。shared_ptr內部的引用計數(shù)是安

    2024年02月07日
    瀏覽(24)
  • C++之weak_ptr與shared_ptr智能指針實例(一百九十五)

    C++之weak_ptr與shared_ptr智能指針實例(一百九十五)

    簡介: CSDN博客專家,專注Android/Linux系統(tǒng),分享多mic語音方案、音視頻、編解碼等技術,與大家一起成長! 優(yōu)質專欄: Audio工程師進階系列 【 原創(chuàng)干貨持續(xù)更新中…… 】?? 人生格言: 人生從來沒有捷徑,只有行動才是治療恐懼和懶惰的唯一良藥. 更多原創(chuàng),歡迎關注:An

    2024年02月09日
    瀏覽(24)
  • C++從入門到精通——auto的使用

    C++的auto用于自動推導變量的類型,讓編譯器根據(jù)變量的初始化表達式來確定其類型。使用auto可以簡化代碼,并且可以在某些情況下提高代碼的可讀性和靈活性。 使用auto聲明變量時,變量的類型將根據(jù)初始化表達式的類型進行推導。例如: auto也可以和引用一起使用,

    2024年04月25日
    瀏覽(11)
  • shared_ptr和unique_ptr主動釋放

    shared_ptr和unique_ptr均可以采用reset()來進行釋放,unique_ptr調用了reset之后就會直接釋放掉,shared_ptr則會在所有引用計數(shù)變?yōu)?的時候才會釋放申請的內存。 注意unique_ptr的release()方法,并不會釋放資源,只會把unique_ptr置為空指針,原來那個資源可以繼續(xù)調用 reset 結果: 在reset之

    2024年02月14日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包