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

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

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

2024年12月26日 更新

點(diǎn)贊、收藏、星標(biāo)不會(huì)錯(cuò)過精彩推送哦!當(dāng)我們?cè)诰帉?C++ 代碼時(shí),動(dòng)態(tài)分配內(nèi)存是一個(gè)常見的需求。然而,手動(dòng)管理內(nèi)存往往會(huì)導(dǎo)致內(nèi)存泄漏、懸掛指針以及難以維護(hù)的代碼。為了解決這些問題,C++11 引入了智能指針,其中之一就是 std::unique_ptr。std::unique_ptr 是一個(gè)智能指針...

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

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

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

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

微信號(hào):151******60

立即咨詢

    相關(guān)資訊

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

    南京蘇嵌教育,2010年南大教授牽頭創(chuàng)辦。近60人團(tuán)隊(duì),林錦國(guó)教授等專家坐鎮(zhèn)。合作二十多所高校,萬余名工程師從這里走出。江蘇省規(guī)模較大的嵌入式實(shí)訓(xùn)機(jī)構(gòu),人稱“黃埔軍校”。24小時(shí)答疑、小班教學(xué),全棧課程覆蓋AI、硬件、驅(qū)動(dòng)。簽就業(yè)協(xié)議,薪資不達(dá)標(biāo)*。本文主要信息和數(shù)據(jù)源自該機(jī)構(gòu)在教育寶(中國(guó)知名的第三方平臺(tái))的店鋪內(nèi)容。

    2025/9/26 21:12:01
  • 中國(guó)央行連續(xù)10個(gè)月增持黃金 儲(chǔ)備占比創(chuàng)歷史新高

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

    2025/9/16 0:03:54
  • AI 時(shí)代普通人的機(jī)會(huì)在哪

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

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

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

    2025/8/22 0:13:06
  • 985畢業(yè)生送外賣:高材生為何甘當(dāng)騎手?

    現(xiàn)在985畢業(yè)生送外賣,已經(jīng)不讓人感到意外了。以前,985高校那可是精英搖籃,畢業(yè)生都是奔著高端崗位去的,進(jìn)大廠、搞科研,多風(fēng)光。可如今,咋就開始送外賣了呢?這其實(shí)和就業(yè)大環(huán)境有關(guān)。經(jīng)濟(jì)形勢(shì)復(fù)雜,很多行業(yè)都不景氣。大企業(yè)招聘名額減少,競(jìng)爭(zhēng)變得異常激烈。就算是985畢業(yè)生,也不一定能找到理想工作。好崗...

    2025/8/17 0:12:56

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

機(jī)構(gòu)評(píng)分

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

公示信息

店鋪名稱:南京蘇嵌教育

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

賬號(hào)名稱:njsqjy(155******33)

所屬城市:江蘇南京

入駐時(shí)長(zhǎng):16年

在線客服:在線聊

微信咨詢

返回頂部