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

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

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

2024年12月26日 更新

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

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

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

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

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

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

立即咨詢

    相關(guān)資訊

  • 第一批 90 后,正在迎來斷崖式衰老

    曾幾何時,90 后還是年輕活力的代名詞,可如今,第一批 90 后真切地感受到了 “斷崖式衰老” 的沖擊。身體的變化*為直觀。脫發(fā)堪稱衰老的 “先遣部隊”,走在大街上,常能看到頭頂日漸稀疏的 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)光??扇缃瘢烷_始送外賣了呢?這其實和就業(yè)大環(huán)境有關(guān)。經(jīng)濟形勢復(fù)雜,很多行業(yè)都不景氣。大企業(yè)招聘名額減少,競爭變得異常激烈。就算是985畢業(yè)生,也不一定能找到理想工作。好崗...

    2025/8/17 0:12:56
  • 9月1日社保新規(guī)實施,這些要點你必須知道

    最近,“9 月 1 日起全員強制交社?!?的消息在網(wǎng)絡(luò)上鬧得沸沸揚揚,可把不少個體戶嚇得不輕。有人擔(dān)心工資會大幅縮水,自由職業(yè)者更是害怕以后要被迫參保。但實際上,這是對新規(guī)的嚴(yán)重誤解。這次新規(guī)的源頭,是*高人民法院在 7 月 31 日發(fā)布的《關(guān)于審理勞動爭議案件適用法律問題的解釋(二)》,該解釋自 ...

    2025/8/12 0:13:12
  • 為何大學(xué)開設(shè)的專業(yè)總是落后社會需求5到10年

    專業(yè)選擇這事兒,以前“冷熱交替”的周期挺長。就說十幾年前,計算機、金融專業(yè)那是香餑餑,學(xué)這些專業(yè)畢業(yè)找工作容易,薪資還高,好多人擠破頭往里面鉆。那會兒選了這些專業(yè),就跟拿了鐵飯碗似的。可現(xiàn)在不一樣了,變化快得很。前幾年大數(shù)據(jù)專業(yè)突然火了,好多高校趕緊開設(shè)這個專業(yè),學(xué)生們也跟風(fēng)報考。但沒幾年,人工智能...

    2025/7/13 0:12:10
  • 地鐵口電動車成災(zāi),你的城市也病了嗎?

    最近經(jīng)濟不景氣,大家錢包都緊,騎電動車的人明顯變多了。你想啊,電動車多劃算——買一輛才兩三千,充一次電幾塊錢能跑好幾天,比開車加油或者天天擠公交地鐵便宜多了?,F(xiàn)在連外賣小哥、跑腿的都比以前多,電動車可不就越來越常見了嘛!再加上政府搞以舊換新補貼,不少人干脆把老摩托換了新電驢,省錢又方便,路上小電驢...

    2025/7/13 0:12:10

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

機構(gòu)評分

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

公示信息

店鋪名稱:南京蘇嵌教育

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

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

所屬城市:江蘇南京

入駐時長:16年

在線客服:在線聊

微信咨詢

返回頂部