精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++ 面試題:用 unique_ptr 作為返回值可以嗎?

開發(fā)
使用unique_ptr作為函數(shù)返回值的核心優(yōu)勢在于明確所有權(quán)轉(zhuǎn)移與自動化資源釋放。

首先給出答案:使用 std::unique_ptr 作為函數(shù)返回值不僅是合法的,而且是一種推薦做法,尤其在需要明確轉(zhuǎn)移對象所有權(quán)時。 

寫個簡單的測試代碼:

#include <iostream>
#include <functional>

classA
{
public:
        voidfunc()
        {
                std::cout << "A::Func" << std::endl;
        }
};

std::unique_ptr<A> CreateA()
{
        std::unique_ptr<A> pA = std::make_unique<A>();

        return pA;//正確
        //return std::move(pA);//也正確 兩種方法都可以
}

intmain()
{        
        auto p = CreateA();
        p->func();

        getchar();
        return0;
}

return pA; 和 return std::move(pA); 兩種寫法都可以! 

一、unique_ptr作為返回值的核心優(yōu)勢

1. 明確所有權(quán)轉(zhuǎn)移語義

unique_ptr的“唯一所有權(quán)”特性,天然適合用于表示資源的轉(zhuǎn)移。  

當(dāng)函數(shù)返回unique_ptr時,相當(dāng)于向調(diào)用者傳遞一個明確的信息:“這個對象的所有權(quán)現(xiàn)在屬于你,你負(fù)責(zé)管理它的生命周期。” 

代碼示例:  

std::unique_ptr<DatabaseConnection> createConnection() {
    return std::make_unique<DatabaseConnection>("user", "password");
}

int main() {
    auto conn = createConnection(); // 所有權(quán)轉(zhuǎn)移至main函數(shù)
    conn->query("SELECT * FROM table"); 
} // conn自動釋放,連接關(guān)閉

對比分析:  若返回裸指針或 shared_ptr,調(diào)用者可能誤解是否需要釋放資源或共享所有權(quán),而unique_ptr徹底避免了這類歧義。 

2. 工廠模式的天然搭檔

工廠函數(shù)的核心任務(wù)是創(chuàng)建對象并移交控制權(quán)。unique_ptr與工廠模式完美契合。 

擴(kuò)展案例:多態(tài)對象的創(chuàng)建  

class Animal {
public:
    virtual ~Animal() = default;
    virtualvoidspeak()const= 0;
};

classDog : public Animal {
public:
    voidspeak()constoverride{ std::cout << "Woof!"; }
};

classCat : public Animal {
public:
    voidspeak()constoverride{ std::cout << "Meow!"; }
};

// 工廠函數(shù)返回基類的unique_ptr
std::unique_ptr<Animal> createAnimal(const std::string& type){
    if (type == "dog") return std::make_unique<Dog>();
    if (type == "cat") return std::make_unique<Cat>();
    throw std::invalid_argument("Unknown animal type");
}

關(guān)鍵點:  

  • 基類必須有虛析構(gòu)函數(shù),確保正確釋放派生類資源。
  • 調(diào)用者無需關(guān)心具體類型,通過基類接口操作對象。

3. 異常安全的強保證

在可能拋出異常的代碼中,unique_ptr 能確保資源不被泄漏。 

場景分析:  

// 錯誤示例:裸指針在異常時泄漏
voidunsafeProcess(){
    int* data = newint[1024];
    process(data);  // 若拋出異常,內(nèi)存可能泄漏!
    delete[] data;
}

// 正確示例:unique_ptr 自動釋放
voidsafeProcess(){
    auto data = std::make_unique<int[]>(1024);
    process(data.get());  // 即使異常,內(nèi)存仍釋放
}

若使用裸指針,在process() 拋出異常時,內(nèi)存將泄漏;而unique_ptr在任何執(zhí)行路徑下都能正確釋放資源。 

4. 幾乎零額外開銷的性能優(yōu)勢

盡管unique_ptr提供了自動化管理,但其性能與裸指針幾乎無異(這點和 shared_ptr 指針有很大區(qū)別)。 

編譯器優(yōu)化機(jī)制:

(1) 返回值優(yōu)化(RVO)

RVO 是C++編譯器的一種優(yōu)化技術(shù),旨在消除函數(shù)返回對象時的不必要拷貝或移動操作。其核心思想是:直接在調(diào)用者的內(nèi)存空間中構(gòu)造返回的對象,而非在函數(shù)內(nèi)部構(gòu)造后再拷貝或移動到調(diào)用者處。 

① RVO的工作機(jī)制 

  • 傳統(tǒng)流程(無RVO): 函數(shù)內(nèi)部構(gòu)造對象 → 將對象拷貝/移動到調(diào)用者的接收位置 → 銷毀函數(shù)內(nèi)的臨時對象。 此過程可能觸發(fā)拷貝構(gòu)造函數(shù)或移動構(gòu)造函數(shù)。 
  • RVO優(yōu)化后流程: 編譯器直接在調(diào)用者預(yù)留的內(nèi)存空間中構(gòu)造對象,跳過了臨時對象的創(chuàng)建和傳遞。 這意味著沒有拷貝或移動操作發(fā)生,對象的構(gòu)造和析構(gòu)僅發(fā)生一次。 

② RVO的觸發(fā)條件 

  • 返回的必須是局部對象(非全局或靜態(tài)對象)。 
  • 返回的表達(dá)式類型與函數(shù)返回類型嚴(yán)格匹配。 
  • 返回的表達(dá)式是純右值(prvalue)(例如直接返回構(gòu)造函數(shù)調(diào)用或 make_unique 的結(jié)果)。 

代碼示例: 

// 觸發(fā)RVO的情況
std::unique_ptr<int> create() {
    return std::make_unique<int>(42);  // 直接返回prvalue
}

(2) 命名返回值優(yōu)化( NRVO)

NRVO 是C++編譯器對返回具名局部對象時的一種優(yōu)化技術(shù)。與RVO(返回值優(yōu)化)不同,NRVO針對的是函數(shù)內(nèi)部已命名且非臨時的局部變量作為返回值的情況。 

① NRVO基本定義 

NRVO:當(dāng)函數(shù)返回一個在函數(shù)內(nèi)部定義并命名的局部對象時,編譯器嘗試直接在調(diào)用者的內(nèi)存空間中構(gòu)造該對象,避免額外的拷貝或移動。 

② NRVO與RVO的區(qū)別: 

  • RVO優(yōu)化的是返回純右值(prvalue)(例如return A();)。 
  • NRVO優(yōu)化的是返回具名局部變量(例如A a; return a;)。 

(3) 移動語義

當(dāng)RVO和NRVO不適用時,C++11的移動語義會將資源所有權(quán)轉(zhuǎn)移而非復(fù)制。 

// RVO場景:返回臨時對象(prvalue)
std::unique_ptr<int> rvoExample() {
    return std::make_unique<int>(42); // RVO生效
}

// NRVO場景:返回具名局部變量
std::unique_ptr<int> nrvoExample() {
    auto ptr = std::make_unique<int>(42); 
    return ptr; // 可能觸發(fā)NRVO或移動語義
}

注意:NRVO編譯器支持程度不同,優(yōu)先依賴 RVO,NRVO 不是 C++ 標(biāo)準(zhǔn)強制要求的! 

性能測試對比:在10萬次對象創(chuàng)建測試中,unique_ptr返回與裸指針直接 new 的性能差異小于1%。

二、unique_ptr 作為返回值的實踐細(xì)節(jié)

1. 返回局部對象的正確方式

無需std::move:  

std::unique_ptr<MyClass> createObject() {
    auto obj = std::make_unique<MyClass>();
    obj->initialize();
    return obj; // 正確!編譯器自動應(yīng)用移動語義
}
return std::move(obj); // 不必要!可能抑制RVO優(yōu)化

2. 處理繼承與多態(tài)

基類聲明虛析構(gòu)函數(shù):  

class Base {
public:
    virtual ~Base() = default; // 必須聲明為虛函數(shù)!
};

class Derived : public Base { /*...*/ };

std::unique_ptr<Base> createDerived() {
    return std::make_unique<Derived>();
}

技術(shù)細(xì)節(jié):  

  • 若基類析構(gòu)函數(shù)非虛,通過基類指針刪除派生對象是未定義行為。
  • make_unique 在構(gòu)造時即確定具體類型,確保正確析構(gòu)。

三、unique_ptr與STL容器的交互

容器中的 unique_ptr 不能被復(fù)制,只能通過移動或引用來操作。 

插入元素: 

#include <memory>
#include <vector>

int main() {
    std::vector<std::unique_ptr<int>> vec;

    // 正確:通過移動語義插入
    auto ptr = std::make_unique<int>(42);
    vec.push_back(std::move(ptr));  // ptr所有權(quán)轉(zhuǎn)移至vec,ptr變?yōu)閚ullptr

    // 直接構(gòu)造并插入(C++11起)
    vec.emplace_back(std::make_unique<int>(100)); // 無拷貝或移動,直接構(gòu)造在容器內(nèi)
}

訪問元素:通過迭代器或索引訪問容器內(nèi)的 unique_ptr,但需注意不能轉(zhuǎn)移所有權(quán)。

// 訪問但不轉(zhuǎn)移所有權(quán)
if (!vec.empty()) {
    std::cout << *vec[0] << std::endl;  // 解引用訪問對象值
    auto& ref = vec.front();            // 獲取引用,仍由容器管理所有權(quán)
}

刪除元素:當(dāng)從容器中移除元素時,unique_ptr會自動釋放其管理的對象。 

vec.pop_back();  // 移除最后一個元素,其管理的對象被銷毀

vec.erase(vec.begin());  // 刪除首個元素,對象立即釋放

四、優(yōu)秀實踐與常見陷阱

1. 必須避免的錯誤

陷阱1:返回局部變量的地址  

std::unique_ptr<int> invalidReturn() {
    int x = 42;
    return std::unique_ptr<int>(&x); // 錯誤!x是棧對象
} // x被銷毀,導(dǎo)致懸垂指針

陷阱2:所有權(quán)不明導(dǎo)致重復(fù)釋放  

auto ptr = std::make_unique<int>(10);
int* raw = ptr.get();
delete raw; // 錯誤!unique_ptr仍擁有所有權(quán)

2. 設(shè)計原則

  • 單一所有權(quán)原則:每個資源有且僅有一個unique_ptr擁有所有權(quán)。  
  • 優(yōu)先使用make_unique:比直接new更安全(異常安全)和高效。  
  • 接口明確性:函數(shù)返回unique_ptr即宣告所有權(quán)轉(zhuǎn)移,調(diào)用者必須接收或顯式忽略。 

五、結(jié)論

使用unique_ptr作為函數(shù)返回值的核心優(yōu)勢在于明確所有權(quán)轉(zhuǎn)移與自動化資源釋放。 

開發(fā)者應(yīng)遵循以下準(zhǔn)則: 

  • 優(yōu)先依賴編譯器優(yōu)化:避免不必要的std::move,信任RVO/NRVO機(jī)制。 
  • 工廠函數(shù)首選:用于創(chuàng)建動態(tài)對象,傳遞清晰的所有權(quán)語義。 
  • 避免跨作用域濫用:僅在單一作用域內(nèi)管理資源,復(fù)雜場景結(jié)合shared_ptr使用。
  • 結(jié)合自定義刪除器:擴(kuò)展 unique_ptr 至非內(nèi)存資源管理。 
責(zé)任編輯:趙寧寧 來源: CppPlayer
相關(guān)推薦

2025-05-28 08:50:00

C++循環(huán)引用節(jié)點

2025-05-22 10:10:00

C++循環(huán)引用開發(fā)

2025-09-15 02:00:00

2025-06-24 10:00:00

智能指針代碼unique_ptr

2021-10-27 11:00:30

C++語言面試

2025-05-23 08:15:00

C++constexpr字面類型

2025-06-09 07:55:00

C++引用語言

2025-05-26 03:20:00

2024-01-24 11:35:28

C++多返回值開發(fā)

2025-05-20 10:00:00

C++命名空間別名代碼

2025-05-06 08:20:00

互斥鎖C++編程

2011-03-29 14:31:41

CC++

2025-05-27 10:15:00

void*函數(shù)開發(fā)

2025-04-30 10:10:00

在 C++C++11Lambda

2009-09-07 03:07:11

C# Main方法

2025-05-20 08:10:00

函數(shù)函數(shù)類型函數(shù)指針類型

2020-06-04 14:40:40

面試題Vue前端

2025-06-05 08:05:00

vectorC++對象存儲

2021-12-19 23:58:51

Golang語言返回值

2011-03-24 13:27:37

SQL
點贊
收藏

51CTO技術(shù)棧公眾號

日本精品久久电影| 色噜噜狠狠一区二区三区果冻| 91视频-88av| 免费在线观看国产精品| 国内视频在线精品| 精品久久久久人成 | h视频久久久| 色欲综合视频天天天| 中文字幕欧美日韩一区二区三区| 精品人妻伦一二三区久久| 国产亚洲午夜| 久久视频免费观看| 800av在线播放| 日韩伦理一区二区| 午夜精品久久久久| 中文字幕国产日韩| 少妇高潮一69aⅹ| 亚洲天堂1区| 亚洲国产视频在线| 亚洲精品白虎| 日本大臀精品| 国产不卡视频在线观看| 国产精品欧美日韩一区二区| 日韩三级小视频| 伊人久久大香线蕉精品组织观看| 日韩精品在线免费观看| 波多野结衣三级视频| 日韩一区精品| 日韩欧美福利视频| 国产系列第一页| a中文在线播放| 99国产精品一区| 99热在线播放| 国产日韩一级片| 奇米在线7777在线精品| 欧美性受xxxx黑人猛交| 国产第一页第二页| 欧美一区亚洲| 久久福利视频导航| 99热这里只有精品4| 欧美一级精品| 亚洲天堂av电影| www.久久国产| 色婷婷久久久| 精品视频中文字幕| 人妻丰满熟妇aⅴ无码| 美女扒开腿让男人桶爽久久动漫| 欧美成人高清电影在线| 精品人妻一区二区三区免费| 成人日韩视频| 欧美一级理论性理论a| 中文字幕色网站| 国产欧美视频在线| 日韩午夜精品视频| 国产精品99久久久精品无码| 国产在线不卡一区二区三区| 91麻豆精品国产91久久久更新时间| 五月天av在线播放| 祥仔av免费一区二区三区四区| 欧美日韩精品三区| www.成人黄色| 日韩免费一级| 亚洲国产成人精品电影| 真人bbbbbbbbb毛片| 亚洲精品进入| 中文日韩在线视频| 午夜精品福利在线视频| 欧美天堂亚洲电影院在线观看 | av在线理伦电影| 午夜精品一区二区三区电影天堂 | 亚洲欧美高清| 国产精品成人av性教育| 一本一道精品欧美中文字幕| 国内精品免费**视频| 草莓视频一区| 日韩av地址| 国产精品网站在线| 久久久久福利视频| 黄视频网站在线观看| 色婷婷综合久久久中文字幕| 国产原创精品在线| 日本免费精品| 亚洲美女自拍视频| 午夜激情福利电影| 亚洲福利久久| 国产成人精品日本亚洲| 91theporn国产在线观看| 国产高清无密码一区二区三区| 国产精品一区二区三区免费| 久草在现在线| 亚洲一卡二卡三卡四卡五卡| 免费在线观看毛片网站| 91丨精品丨国产| 亚洲激情视频在线观看| 欧美福利第一页| 欧美成人69| 国产精品电影网| 精品人妻无码一区二区| 久久综合狠狠综合| 男人的天堂视频在线| 亚洲性色av| 日韩亚洲电影在线| 欧洲av一区二区三区| 欧美fxxxxxx另类| 国产精品第一第二| 亚州男人的天堂| 17c精品麻豆一区二区免费| 青青草视频在线免费播放| 激情中国色综合| 日韩精品电影网| 永久看片925tv| 久久只有精品| 国内精品久久国产| 黄色的网站在线观看| 一区二区在线免费观看| 中文字幕无码不卡免费视频| 88久久精品| 久久亚洲精品视频| 国产真人无遮挡作爱免费视频| 成人性视频免费网站| 在线观看三级网站| 狠狠久久伊人中文字幕| 亚洲天堂男人天堂| 久久黄色精品视频| 成人网页在线观看| 9191国产视频| 九九99久久精品在免费线bt| 日韩在线一区二区三区免费视频| 亚洲天堂视频网站| 成年人午夜久久久| youjizz.com在线观看| 爱情电影网av一区二区| 最近2019中文字幕在线高清| 波多野结衣黄色| 久久久久久久久久久电影| www.日本在线播放| 国产精品对白久久久久粗| 欧美成人久久久| 国产一区二区三区视频免费观看| 国产午夜精品久久久久久久| 国模杨依粉嫩蝴蝶150p| 欧美人与牛zoz0性行为| 日本欧美精品在线| 午夜视频福利在线观看| 亚洲v精品v日韩v欧美v专区| jjzz黄色片| 国语自产精品视频在线看8查询8| 91午夜在线播放| 99久久精品免费观看国产| 678五月天丁香亚洲综合网| 国产白丝一区二区三区| 麻豆国产精品官网| japanese在线视频| 久久国产精品免费一区二区三区| 精品自在线视频| 国产77777| 午夜精品国产更新| 亚洲成人日韩在线| 日韩综合在线视频| 亚洲欧洲另类精品久久综合| 99国内精品久久久久| 久久国产精品久久久久| 亚洲精品综合网| 精品国产乱码久久久久久婷婷 | www.天天射.com| 日韩欧美1区| 成人免费视频网| 女囚岛在线观看| 日韩成人高清在线| 久久午夜鲁丝片| 亚洲日本中文字幕区| 色婷婷狠狠18禁久久| 夜夜嗨一区二区| 日本一区二区精品视频| 四虎国产精品免费久久| 久久国产精品首页| 污污视频在线免费看| 色综合久久中文综合久久97| 亚洲精品91在线| 激情欧美一区二区| 国产精品国三级国产av| 亚洲宅男一区| 成人激情免费在线| 丁香花电影在线观看完整版| 亚洲欧美一区二区三区久久| 国产精品欧美亚洲| 精品成人av一区| 欧美性生交大片| 波多野结衣一区二区三区 | 三区精品视频| 欧美日韩午夜电影网| 91精品国产乱码久久久久久久久| 国产98在线| 日韩精品中文字幕一区| 日批视频免费在线观看| 日本成人在线一区| 18视频在线观看娇喘| 久久99视频| 国产精品国色综合久久| 韩国精品视频在线观看| 午夜精品一区二区三区在线视频 | 国产一区在线电影| 国产美女精品免费电影| 波多野结衣在线高清| 日韩在线视频一区| 青青操视频在线| 日韩欧美在线观看一区二区三区| 99精品人妻国产毛片| 亚洲精品老司机| 成人信息集中地| 97超碰欧美中文字幕| 波多野结衣在线免费观看| 久久午夜视频| 国产午夜福利100集发布| 久久久久久久久丰满| 日韩.欧美.亚洲| 久久久久观看| 产国精品偷在线| 成人在线精品| 国产区精品视频| 99久久久国产精品免费调教网站 | 亚洲女成人图区| 蜜臀av中文字幕| 日韩视频中午一区| 一区二区的视频| 欧美三级在线播放| 无码人妻丰满熟妇奶水区码| 亚洲v中文字幕| 国产第100页| 一区二区三区日韩欧美精品| 欧美风情第一页| 中文字幕免费在线观看视频一区| 野外性满足hd| 26uuu国产一区二区三区| 中文字幕乱码在线| 成人美女视频在线观看| 麻豆精品国产传媒| 国产精品一区二区免费不卡| 激情在线观看视频| 国产曰批免费观看久久久| 91亚洲精品久久久蜜桃借种| 麻豆一区二区在线| 中文字幕在线综合| 精一区二区三区| 亚洲免费在线播放视频| 国内精品写真在线观看| 无码人妻一区二区三区在线视频| 国产剧情一区二区| 日韩大尺度视频| www.av亚洲| 无码人妻精品一区二区三区温州| 91亚洲精品久久久蜜桃| 加勒比一区二区| 国产视频911| 91免费在线看片| 中文字幕亚洲在| 天天看片中文字幕| 亚洲福利视频一区二区| 尤物视频在线观看国产| 欧美丝袜第一区| 波多野结衣一区二区三区在线| 欧洲精品在线观看| 91尤物国产福利在线观看| 欧美一级精品在线| 国产黄色小视频在线观看| 亚洲精品一区二区三区四区高清| 五月天婷婷社区| 亚洲无线码在线一区观看| av女优在线| 欧美日韩第一视频| 亚洲欧美一区二区三区| 国产精品高清网站| 精品麻豆剧传媒av国产九九九| 国产不卡一区二区在线观看 | 一本一道久久a久久综合精品| 羞羞答答成人影院www| 欧美一区二区激情| 日日嗨av一区二区三区四区| www.色.com| 97国产一区二区| 成人在线观看小视频| 亚洲国产乱码最新视频| 日本中文字幕在线观看视频| 在线综合亚洲欧美在线视频| 色综合久久久久久| 中文字幕在线成人| 金瓶狂野欧美性猛交xxxx| 国产999精品久久久影片官网| 国产成人视屏| 欧美日韩无遮挡| 一区二区日韩欧美| 欧美日本视频在线观看| 久久99久久久欧美国产| 欧美一区二区免费在线观看| 国产精品亲子伦对白| 日韩美女视频网站| 欧美日韩国产不卡| 日批视频在线播放| 久久国产一区二区三区| 在线观看爽视频| 亚洲综合中文字幕在线观看| 欧美女王vk| www..com日韩| 精彩视频一区二区三区| 久久精品国产亚洲AV熟女| 亚洲一区二区欧美日韩| 亚洲中文字幕在线观看| 日韩国产高清视频在线| 超碰个人在线| 日本高清+成人网在线观看| 伊色综合久久之综合久久| 亚洲啪啪av| 天堂成人国产精品一区| 国产69视频在线观看| 亚洲免费观看在线视频| 91麻豆精品在线| 亚洲欧洲激情在线| av3级在线| 亚洲一区二区三区四区在线播放 | 99热这里都是精品| 九九视频免费看| 欧美一区二区日韩一区二区| av黄色在线观看| 国产精国产精品| 嫩草影视亚洲| 春日野结衣av| 9i在线看片成人免费| 国产一级免费观看| 日韩免费高清视频| 91精品久久| 91在线|亚洲| 91精品电影| 性生活在线视频| 亚洲精品国产无天堂网2021| 国产又粗又猛视频| 日韩中文娱乐网| 91精品视频一区二区| 一区视频二区视频| 久久99热狠狠色一区二区| 99re6热在线精品视频| 欧美日韩国产综合视频在线观看| 成人午夜影视| 国产精品88a∨| 精品国产一区一区二区三亚瑟 | 日韩字幕在线观看| 亚洲第一精品福利| 精品极品在线| 欧美午夜精品久久久久免费视| 国产精品日韩| 日本少妇高潮喷水xxxxxxx| 91久久人澡人人添人人爽欧美| 日韩三级电影网| 国产成人精品亚洲精品| 精品国产成人| 亚洲天堂国产视频| 亚洲日本青草视频在线怡红院| av综合在线观看| 久久久久久国产精品久久| xxx在线免费观看| 国产精品视频500部| 日韩视频二区| 免费看91的网站| 88在线观看91蜜桃国自产| 在线欧美三级| 精品不卡在线| 日韩精品一区第一页| 日本裸体美女视频| 日韩欧美在线影院| 日韩伦理在线一区| 日韩精品无码一区二区三区| 久久er精品视频| 国产性一乱一性一伧一色| 日韩精品黄色网| av成人免费| 国产freexxxx性播放麻豆| 91色视频在线| 91精品人妻一区二区三区果冻| 欧美人在线视频| 美日韩中文字幕| 亚洲小视频网站| 五月天丁香久久| 91露出在线| 国内精品久久国产| 另类专区欧美蜜桃臀第一页| 久久无码精品丰满人妻| 亚洲日本中文字幕免费在线不卡| 亚洲精品aaa| jizzjizz国产精品喷水| 亚洲同性gay激情无套| 少妇一级淫片免费看| 国产精品欧美一区二区| 亚洲精品美女| 久久精品一区二区三区四区五区| 亚洲精品mp4| 伊人久久一区| 99视频在线免费| 亚洲图片有声小说| 在线视频自拍| 欧美一区少妇| 大桥未久av一区二区三区中文|