南京蘇嵌教育老師直接接聽

400-029-09** 400-029-0997 轉(zhuǎn) 149416
查看完整號碼
掃碼撥號
微信掃碼撥號

C++新特性 智能指針std::unique_ptr

2024年12月26日 更新

點贊、收藏、星標不會錯過精彩推送哦!當我們在編寫 C++ 代碼時,動態(tài)分配內(nèi)存是一個常見的需求。然而,手動管理內(nèi)存往往會導致內(nèi)存泄漏、懸掛指針以及難以維護的代碼。為了解決這些問題,C++11 引入了智能指針,其中之一就是 std::unique_ptr。std::unique_ptr 是一個智能指針...

點贊、收藏、星標不會錯過精彩推送哦!當我們在編寫 C++ 代碼時,動態(tài)分配內(nèi)存是一個常見的需求。然而,手動管理內(nèi)存往往會導致內(nèi)存泄漏、懸掛指針以及難以維護的代碼。為了解決這些問題,C++11 引入了智能指針,其中之一就是 std::unique_ptr。std::unique_ptr 是一個智能指針類,用于管理動態(tài)分配的對象,并確保在其生命周期結(jié)束時釋放相應的內(nèi)存。在這篇文章中,我們將深入了解 std::unique_ptr 的用法、優(yōu)點以及一些注意事項。1. 簡介std::unique_ptr 是 C++ 標準庫中的模板類,位于 <memory> 頭文件中。它的特點是在同一時間只能有一個 unique_ptr 指向給定的對象,因此它是一種獨占所有權(quán)的智能指針。當 unique_ptr 被銷毀時,它所管理的內(nèi)存也會被自動釋放,從而避免了內(nèi)存泄漏的風險。2. 基本用法下面是 std::unique_ptr 的基本用法示例:#include <iostream>#include <memory>int main() {    // 創(chuàng)建一個 unique_ptr,指向一個 int 對象    std::unique_ptr<int> ptr(new int(42));    // 使用 unique_ptr 操作指向的對象    std::cout << "Value: " << *ptr << std::endl;    // unique_ptr 在生命周期結(jié)束時會自動釋放內(nèi)存    return 0;}3. 構(gòu)造函數(shù)std::unique_ptr 提供了多種構(gòu)造函數(shù),用于管理動態(tài)分配的資源,并在適當?shù)臅r候釋放這些資源。以下是 std::unique_ptr 的主要構(gòu)造函數(shù):默認構(gòu)造函數(shù):std::unique_ptr<T> ptr;創(chuàng)建一個空的 std::unique_ptr,不管理任何對象。指針構(gòu)造函數(shù):std::unique_ptr<T> ptr(new T);創(chuàng)建一個 std::unique_ptr,管理一個通過 new 運算符分配的對象。自定義刪除器構(gòu)造函數(shù):有時候我們需要在釋放內(nèi)存之前執(zhí)行一些特定的操作,這時可以使用自定義刪除器。刪除器是一個函數(shù)對象,負責在 unique_ptr 被銷毀時調(diào)用,從而執(zhí)行所需的操作。創(chuàng)建一個 std::unique_ptr,并指定一個自定義的刪除器 customDeleter,用于釋放資源。void customDeleter(int* ptr) {    std::cout << "Deleting memory at address: " << ptr << std::endl;    delete ptr;}int main() {    std::unique_ptr<int, decltype(&customDeleter)> ptr(new int(42), customDeleter);    return 0;}移動構(gòu)造函數(shù):std::unique_ptr<T> ptr1 = std::make_unique<T>(args);std::unique_ptr<T> ptr2 = std::move(ptr1);使用 std::move() 將 ptr1 的所有權(quán)轉(zhuǎn)移到 ptr2。也可以使用 std::make_unique 創(chuàng)建對象,并將其移動到 std::unique_ptr。初始化列表構(gòu)造函數(shù)(C++14 及以上版本):std::unique_ptr<T> ptr = std::make_unique<T>(args);使用 std::make_unique 創(chuàng)建對象,并將其初始化為 std::unique_ptr。4. 賦值操作std::unique_ptr 禁用了復制構(gòu)造函數(shù)和賦值運算符,這是因為它的設計目標是提供獨占所有權(quán)語義,這與賦值語義沖突。這意味著每個 std::unique_ptr 實例都是的,不能與其他 std::unique_ptr 實例共享所有權(quán)。禁用復制構(gòu)造函數(shù)和賦值運算符有幾個重要的原因:防止拷貝和懸空指針:如果允許復制構(gòu)造函數(shù)和賦值運算符,那么可能會導致多個 std::unique_ptr 實例共享同一塊內(nèi)存,這可能會導致懸空指針問題。當一個 std::unique_ptr 被銷毀時,它將嘗試刪除其所管理的對象,而其他共享同一對象的 std::unique_ptr 實例將指向已經(jīng)被銷毀的對象,這可能導致未定義的行為。強調(diào)獨占所有權(quán)語義:std::unique_ptr 的設計目標之一是強調(diào)獨占所有權(quán)語義,這意味著每個 std::unique_ptr 實例都應該是對象的所有者。通過禁用復制構(gòu)造函數(shù)和賦值運算符,可以明確表明 std::unique_ptr 的性,從而更好地傳達其設計意圖。提高效率:禁用復制構(gòu)造函數(shù)和賦值運算符可以防止不必要的對象拷貝,從而提高代碼的效率。由于 std::unique_ptr 的目標是獨占所有權(quán),因此在大多數(shù)情況下,復制或賦值操作都不是必需的。要在 std::unique_ptr 之間轉(zhuǎn)移所有權(quán),可以使用 std::move() 函數(shù)。這樣可以明確地指示所有權(quán)的轉(zhuǎn)移,并避免懸空指針和未定義行為。5. 移動語義std::unique_ptr 支持移動語義,因此可以通過移動而不是拷貝來傳遞所有權(quán)。這意味著你可以將所有權(quán)從一個 unique_ptr 轉(zhuǎn)移到另一個 unique_ptr,而不會觸發(fā)額外的內(nèi)存分配或釋放。這在函數(shù)返回值和容器中的使用非常方便。std::unique_ptr<int> createIntPtr() {    return std::make_unique<int>(42);}int main() {    std::unique_ptr<int> ptr1 = createIntPtr(); // 移動語義    std::unique_ptr<int> ptr2 = std::move(ptr1); // 移動語義    return 0;}6. 注意事項不要使用裸指針初始化多個 unique_ptr,否則會導致多次釋放同一塊內(nèi)存。避免循環(huán)引用,因為 unique_ptr 不能共享所有權(quán)。盡量使用 std::make_unique 來創(chuàng)建 unique_ptr,以避免不必要的內(nèi)存分配。結(jié)論std::unique_ptr 是 C++ 中用于管理動態(tài)內(nèi)存分配的一種安全、高效的方法。它通過獨占所有權(quán)和移動語義來確保內(nèi)存的正確釋放,從而避免了內(nèi)存泄漏和懸掛指針等問題。然而,在使用時仍需謹慎,避免一些常見的陷阱,以確保代碼的正確性和健壯性。endLinux 世界 關(guān)注,回復【1024】海量Linux資料贈送精彩文章合集專輯推薦?【專輯】Linux命令與系統(tǒng)?【專輯】shell編程推薦閱讀  點擊標題可跳轉(zhuǎn)1、Unix從興盛到衰落鮮為人知的故事2、*受初學者歡迎的Linux系統(tǒng)ubuntu科普3、ubuntu 20.04 界面美化,提高工作舒適度!

Linux 世界我們專注于編程知識和軟件設計分享,包括但不限于C/C++、linux開發(fā)。偶爾也聊聊程序人生。長按二維碼,關(guān)注我們免責聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。

添加微信咨詢
徐老師 @南京蘇嵌教育

專業(yè)解答各類課程問題、介紹師資和學校情況

微信號:151******60

立即咨詢

    相關(guān)資訊

  • 南京蘇嵌教育:嵌入式人才黃埔軍校

    2010年,南大教授牽頭創(chuàng)立。近60人團隊,專家顧問坐鎮(zhèn)。24H答疑,小班面授。合作20+高校,萬余名工程師從這里走出。教材進高校課堂,嵌入式全棧課程覆蓋前沿。簽就業(yè)協(xié)議,薪資不達標*。本文主要信息和數(shù)據(jù)源自該機構(gòu)在教育寶(中國知名的第三方平臺)的店鋪內(nèi)容。

    2025/9/26 21:12:01
  • 黃金落地:非實物交割交易免征增值稅!

    這次黃金交易稅改*受關(guān)注的點:特定交易場所內(nèi)的非實物交割黃金交易,直接免增值稅。但的核心其實是用“實物出不出庫”“黃金干什么用”兩個標準,把稅管得更細了。非實物交割的情況很簡單——場內(nèi)交易、不提貨的,比如黃金ETF、期貨、紙黃金這些,完全不用交稅??梢坏┨嶝洺鰩?,事兒就...

    2025/11/16 0:04:30
  • 中國央行連續(xù)10個月增持黃金 儲備占比創(chuàng)歷史新高

    中國央行已經(jīng)連續(xù)10個月買黃金了——截至2025年8月末,黃金儲備到了7402萬盎司(大概2098噸),對應的儲備資產(chǎn)價值差不多2538億美元,占外匯儲備的比重升到7.64%,創(chuàng)下歷史*高。近期中國黃金儲備的幾個關(guān)鍵數(shù):儲備量7402萬盎司(約2098噸),連續(xù)10個月...

    2025/9/16 0:03:54
  • AI 時代普通人的機會在哪

    AI 時代已然來臨,新技術(shù)的浪潮讓很多人感到焦慮,擔心自己的工作被 AI 取代。但其實,每次技術(shù)變革都伴隨著新的機遇,這次也不例外。2025 年,有不少 AI 風口,普通人只要找對方向,也能分一杯羹。先看看 AI 應用分銷和培訓領(lǐng)域。如今,各種 AI 繪畫、視頻、寫作...

    2025/9/13 18:00:27
  • 第一批 90 后,正在迎來斷崖式衰老

    曾幾何時,90 后還是年輕活力的代名詞,可如今,第一批 90 后真切地感受到了 “斷崖式衰老” 的沖擊。身體的變化*為直觀。脫發(fā)堪稱衰老的 “先遣部隊”,走在大街上,常能看到頭頂日漸稀疏的 90 后。他們?yōu)榱肆糇☆^發(fā),各種防脫洗發(fā)水、生發(fā)液買了一堆,卻依舊難以阻擋頭發(fā)...

    2025/8/22 0:13:06

“南京蘇嵌教育”是南京優(yōu)奈特信息科技有限公司在教育寶平臺開設的店鋪,若該店鋪內(nèi)信息涉嫌虛假或違法,請點擊這里向教育寶反饋,我們將及時進行處理。

機構(gòu)評分

環(huán)境:5.0師資:5.0服務:5.0效果:5.0

公示信息

店鋪名稱:南京蘇嵌教育

單位名稱:南京優(yōu)奈特信息科技有限公司

賬號名稱:njsqjy(155******33)

所屬城市:江蘇南京

入駐時長:16年

在線客服:在線聊

微信咨詢

返回頂部