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

C++面試:對象生命周期 & 垃圾回收

這篇具有很好參考價(jià)值的文章主要介紹了C++面試:對象生命周期 & 垃圾回收。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

????????在C++中,理解對象的生命周期和垃圾回收是非常重要的,尤其是在準(zhǔn)備面試騰訊等大型科技公司的C++開發(fā)崗位時(shí)。這些概念涉及內(nèi)存管理,是C++編程中的核心部分。

目錄

對象生命周期

垃圾回收

手動(dòng)內(nèi)存管理

智能指針

std::unique_ptr 示例

std::shared_ptr 示例

資源獲取即初始化 (RAII)

文件句柄的RAII示例

面試準(zhǔn)備

理解和實(shí)踐

案例分析

案例 1: 使用智能指針

案例 2: 避免內(nèi)存泄漏的異常處理

案例 3: 使用工廠函數(shù)管理資源

案例 4: 遵循RAII原則

最新特性

C++20中的內(nèi)存管理和對象生命周期改進(jìn)


對象生命周期

  1. 創(chuàng)建和構(gòu)造:對象的生命周期開始于對象在內(nèi)存中的創(chuàng)建。這可能通過直接聲明、動(dòng)態(tài)分配或其他方式完成。對象構(gòu)造時(shí),其構(gòu)造函數(shù)被調(diào)用。

  2. 存活期:對象在其被創(chuàng)建后,直到被銷毀之前的這段時(shí)間內(nèi)處于存活狀態(tài)。在這段時(shí)間內(nèi),對象可以被訪問和操作。

  3. 銷毀和析構(gòu):對象的生命周期結(jié)束于對象的銷毀。對于棧分配的對象,當(dāng)它們的作用域結(jié)束時(shí)自動(dòng)銷毀;對于堆分配的對象,需要顯式地使用delete操作來銷毀。對象銷毀時(shí),其析構(gòu)函數(shù)被調(diào)用。

#include <iostream>
using namespace std;

class Sample {
public:
    // 構(gòu)造函數(shù)
    Sample() {
        cout << "對象被創(chuàng)建并構(gòu)造" << endl;
    }

    // 析構(gòu)函數(shù)
    ~Sample() {
        cout << "對象被銷毀并析構(gòu)" << endl;
    }

    // 成員函數(shù)
    void doSomething() {
        cout << "對象處于活躍狀態(tài),執(zhí)行操作" << endl;
    }
};

int main() {
    cout << "程序開始" << endl;

    // 創(chuàng)建和構(gòu)造階段
    Sample* samplePtr = new Sample(); // 動(dòng)態(tài)分配

    // 存活期
    samplePtr->doSomething(); // 調(diào)用成員函數(shù)

    // 銷毀和析構(gòu)階段
    delete samplePtr; // 顯式銷毀動(dòng)態(tài)分配的對象

    // 局部對象的生命周期
    {
        Sample localSample; // 棧分配的對象
        localSample.doSomething(); // 調(diào)用成員函數(shù)
    } // localSample的作用域結(jié)束,自動(dòng)銷毀

    cout << "程序結(jié)束" << endl;
    return 0;
}

?????????執(zhí)行結(jié)果:

程序開始
對象被創(chuàng)建并構(gòu)造
對象處于活躍狀態(tài),執(zhí)行操作
對象被銷毀并析構(gòu)
對象被創(chuàng)建并構(gòu)造
對象處于活躍狀態(tài),執(zhí)行操作
對象被銷毀并析構(gòu)
程序結(jié)束

垃圾回收

????????C++ 不提供內(nèi)置的垃圾回收機(jī)制,與像Java或Python這樣的語言不同。C++程序員需要手動(dòng)管理內(nèi)存。

手動(dòng)內(nèi)存管理

????????在C++中,你需要顯式地分配和釋放內(nèi)存。使用new分配內(nèi)存,使用delete釋放內(nèi)存。不正確地管理內(nèi)存會(huì)導(dǎo)致內(nèi)存泄漏和其他問題。

智能指針

????????C++11引入了智能指針(如std::unique_ptrstd::shared_ptr),以幫助自動(dòng)化內(nèi)存管理。這些智能指針可以在對象不再需要時(shí)自動(dòng)釋放內(nèi)存,降低內(nèi)存泄漏的風(fēng)險(xiǎn)。

std::unique_ptr 示例

??std::unique_ptr是一種獨(dú)占所有權(quán)的智能指針,意味著同一時(shí)間內(nèi)只有一個(gè)unique_ptr可以指向一個(gè)給定的對象。

#include <iostream>
#include <memory> // 包含智能指針的庫

class Sample {
public:
    Sample() {
        std::cout << "Sample Created" << std::endl;
    }
    ~Sample() {
        std::cout << "Sample Destroyed" << std::endl;
    }
    void doSomething() {
        std::cout << "Doing Something" << std::endl;
    }
};

int main() {
    {
        std::unique_ptr<Sample> uPtr(new Sample()); // 創(chuàng)建unique_ptr
        uPtr->doSomething(); // 使用智能指針
    } // uPtr離開作用域,自動(dòng)銷毀Sample對象

    std::cout << "Unique Pointer out of scope" << std::endl;
    return 0;
}

?

std::shared_ptr 示例

??std::shared_ptr是一種共享所有權(quán)的智能指針,允許多個(gè)shared_ptr實(shí)例共同擁有同一個(gè)對象。

#include <iostream>
#include <memory>

class Sample {
public:
    Sample() {
        std::cout << "Sample Created" << std::endl;
    }
    ~Sample() {
        std::cout << "Sample Destroyed" << std::endl;
    }
    void doSomething() {
        std::cout << "Doing Something" << std::endl;
    }
};

int main() {
    std::shared_ptr<Sample> sPtr1;
    {
        std::shared_ptr<Sample> sPtr2 = std::make_shared<Sample>(); // 使用make_shared創(chuàng)建
        sPtr1 = sPtr2; // sPtr1和sPtr2共享對象
        sPtr2->doSomething();
        std::cout << "Shared Pointer sPtr2 out of scope" << std::endl;
    } // sPtr2離開作用域,但對象不會(huì)被銷毀,因?yàn)閟Ptr1仍然擁有它

    sPtr1->doSomething();
    std::cout << "Shared Pointer sPtr1 out of scope" << std::endl;
    // sPtr1離開作用域,對象會(huì)被自動(dòng)銷毀
    return 0;
}

資源獲取即初始化 (RAII)

????????這是一種編程技巧,用于管理資源(如內(nèi)存、線程、文件句柄等)。在RAII中,資源的生命周期與擁有它的對象綁定,當(dāng)對象銷毀時(shí)資源也隨之釋放。

文件句柄的RAII示例

????????在這個(gè)例子中,我們將創(chuàng)建一個(gè)類來封裝對文件的操作。當(dāng)實(shí)例化該類的對象時(shí),它將打開一個(gè)文件;當(dāng)對象的生命周期結(jié)束時(shí),它將自動(dòng)關(guān)閉文件。

#include <iostream>
#include <fstream>
#include <string>

class FileHandler {
private:
    std::fstream file;

public:
    // 構(gòu)造函數(shù):打開文件
    FileHandler(const std::string& filename) {
        file.open(filename, std::ios::out | std::ios::in);
        if (!file.is_open()) {
            std::cerr << "Error opening file: " << filename << std::endl;
        } else {
            std::cout << "File opened successfully: " << filename << std::endl;
        }
    }

    // 向文件寫入內(nèi)容
    void write(const std::string& content) {
        if (file.is_open()) {
            file << content;
        }
    }

    // 讀取文件內(nèi)容
    std::string read() {
        std::string content;
        if (file.is_open()) {
            file.seekg(0, std::ios::beg);
            content.assign((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
        }
        return content;
    }

    // 析構(gòu)函數(shù):關(guān)閉文件
    ~FileHandler() {
        if (file.is_open()) {
            file.close();
            std::cout << "File closed successfully" << std::endl;
        }
    }
};

int main() {
    {
        FileHandler fh("example.txt"); // 文件在這里被打開
        fh.write("Hello, RAII!");      // 寫入內(nèi)容
    } // fh對象離開作用域,自動(dòng)調(diào)用析構(gòu)函數(shù),文件被關(guān)閉

    return 0;
}

????????在這個(gè)例子中,FileHandler類負(fù)責(zé)管理一個(gè)文件。當(dāng)創(chuàng)建FileHandler對象時(shí),文件被打開;當(dāng)FileHandler對象的生命周期結(jié)束(如函數(shù)返回時(shí)),其析構(gòu)函數(shù)會(huì)被調(diào)用,文件會(huì)被自動(dòng)關(guān)閉。這就是RAII技術(shù)的核心:利用對象的生命周期管理資源。這種方法不僅代碼清晰,而且能有效避免資源泄漏,特別是在遇到異常情況時(shí)。?

面試準(zhǔn)備

理解和實(shí)踐

????????確保你理解這些概念,并在編碼練習(xí)中實(shí)踐它們。

案例分析

????????準(zhǔn)備一些關(guān)于如何有效管理內(nèi)存和避免內(nèi)存泄漏的案例。

案例 1: 使用智能指針

????????在現(xiàn)代C++編程中,智能指針是管理動(dòng)態(tài)分配內(nèi)存的首選方式。它們自動(dòng)管理內(nèi)存,減少內(nèi)存泄漏的風(fēng)險(xiǎn)。

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass created" << std::endl; }
    ~MyClass() { std::cout << "MyClass destroyed" << std::endl; }
    void doSomething() { std::cout << "Doing something" << std::endl; }
};

void process() {
    std::unique_ptr<MyClass> myClassPtr(new MyClass());
    myClassPtr->doSomething();
} // myClassPtr在這里離開作用域并自動(dòng)釋放內(nèi)存

int main() {
    process();
    return 0;
}

?

案例 2: 避免內(nèi)存泄漏的異常處理

????????當(dāng)異常發(fā)生時(shí),手動(dòng)管理的內(nèi)存可能不會(huì)被正確釋放,導(dǎo)致內(nèi)存泄漏??梢酝ㄟ^RAII或智能指針來防止這種情況。

#include <iostream>
#include <memory>
#include <stdexcept>

void riskyOperation() {
    std::unique_ptr<int> ptr(new int(10)); // 使用智能指針
    // ...執(zhí)行一些操作...

    // 如果發(fā)生錯(cuò)誤
    throw std::runtime_error("Error occurred");

    // 智能指針會(huì)自動(dòng)清理資源,即使發(fā)生異常
}

int main() {
    try {
        riskyOperation();
    } catch (const std::exception& e) {
        std::cout << "Caught exception: " << e.what() << std::endl;
    }
    return 0;
}

案例 3: 使用工廠函數(shù)管理資源

????????創(chuàng)建工廠函數(shù)來封裝資源的創(chuàng)建和管理邏輯,確保資源總是在安全的環(huán)境下被分配和釋放。

#include <iostream>

class Resource {
public:
    Resource() { std::cout << "Resource acquired" << std::endl; }
    ~Resource() { std::cout << "Resource released" << std::endl; }
};

Resource* createResource() {
    return new Resource();
}

void deleteResource(Resource* resource) {
    delete resource;
}

int main() {
    Resource* res = createResource();
    // 使用資源
    deleteResource(res);
    return 0;
}

案例 4: 遵循RAII原則

????????創(chuàng)建RAII類來封裝資源,確保其在構(gòu)造時(shí)被分配,在析構(gòu)時(shí)被釋放。

#include <iostream>
#include <vector>

class RAIIWrapper {
private:
    std::vector<int>* myVector;

public:
    RAIIWrapper() : myVector(new std::vector<int>()) {}
    ~RAIIWrapper() {
        delete myVector;
    }
    // 提供其他必要的方法和操作符重載
};

void process() {
    RAIIWrapper wrapper;
    // 使用wrapper
} // wrapper在這里離開作用域,自動(dòng)釋放資源

int main() {
    process();
    return 0;
}

????????在這些示例中,我們展示了如何使用智能指針、異常安全編程、工廠模式和RAII原則來有效管理內(nèi)存并防止內(nèi)存泄漏。在準(zhǔn)備面試時(shí),了解這些方法并能在面試中展示你如何在實(shí)際代碼中應(yīng)用它們是非常重要的。

最新特性

????????了解C++的最新版本中對內(nèi)存管理和對象生命周期的改進(jìn)。

截至我最后更新的時(shí)間(2023年4月),C++最新的主要版本是C++20,它帶來了一些對內(nèi)存管理和對象生命周期的改進(jìn)和新特性。以下是一些關(guān)鍵點(diǎn):

C++20中的內(nèi)存管理和對象生命周期改進(jìn)

  1. 概念(Concepts): C++20引入了概念,它是一種模板參數(shù)的約束機(jī)制。雖然概念本身不直接涉及內(nèi)存管理,但它們可以幫助創(chuàng)建更清晰、易于理解的模板代碼,間接提高內(nèi)存管理的安全性和效率。

  2. 協(xié)程(Coroutines): C++20正式引入了協(xié)程支持。協(xié)程是函數(shù)的一種,可以暫停和恢復(fù)執(zhí)行,而不是一次性運(yùn)行到結(jié)束。它們提供了一種更靈活的方式來處理異步操作和懶惰生成,影響了對象的生命周期和內(nèi)存管理。

  3. 改進(jìn)的std::shared_ptr: C++20增加了對std::shared_ptr的功能,比如支持自定義的分配器。這允許更靈活的內(nèi)存管理策略,特別是在需要特定類型的內(nèi)存分配時(shí)。

  4. std::atomic和std::memory_order的改進(jìn): 對于并發(fā)編程,C++20提供了更多控制原子操作和內(nèi)存順序的能力。這些改進(jìn)幫助開發(fā)者更精確地控制多線程環(huán)境中的資源訪問和內(nèi)存管理。

  5. std::span: std::span是一個(gè)新的STL容器,提供了對數(shù)組和類數(shù)組數(shù)據(jù)結(jié)構(gòu)(如std::vector和C數(shù)組)的視圖。這意味著它可以在不擁有數(shù)據(jù)的情況下提供對這些數(shù)據(jù)的訪問,從而提供了更靈活的方式來處理現(xiàn)有數(shù)據(jù),而不需要擔(dān)心內(nèi)存管理。

  6. std::latch和std::barrier: 這些是C++20中引入的新的同步原語,用于協(xié)調(diào)多個(gè)線程間的操作。正確使用這些工具可以避免線程間的資源競爭和潛在的內(nèi)存管理問題。

  7. std::bit_cast: 這個(gè)新的轉(zhuǎn)換函數(shù)允許安全地在不同類型之間轉(zhuǎn)換數(shù)據(jù),而不違反嚴(yán)格的別名規(guī)則。這對于涉及低級內(nèi)存操作的程序是有益的。

????????在準(zhǔn)備面試時(shí),了解并能夠討論這些新特性是有幫助的。你可以強(qiáng)調(diào)如何利用這些特性來編寫更高效、更安全的代碼,特別是在內(nèi)存管理和對象生命周期管理方面。記住,C++的每個(gè)新版本都旨在提高語言的表達(dá)力、安全性和性能,而這些目標(biāo)在內(nèi)存管理和對象生命周期方面尤為關(guān)鍵。文章來源地址http://www.zghlxwxcb.cn/news/detail-818985.html

到了這里,關(guān)于C++面試:對象生命周期 & 垃圾回收的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java八股文面試[JVM]——垃圾回收

    java八股文面試[JVM]——垃圾回收

    參考:JVM學(xué)習(xí)筆記(一)_卷心菜不卷Iris的博客-CSDN博客 GC垃圾回收 面試題: JVM內(nèi)存模型 以及分區(qū),需要詳細(xì)到每個(gè)區(qū)放什么 堆里面的分區(qū):Eden,survival from to,老年代,各自的特點(diǎn)。 GC的三種收集方法:標(biāo)記清除、標(biāo)記整理、復(fù)制算法的原理與特點(diǎn),分別用在什么地方 針

    2024年02月11日
    瀏覽(45)
  • 《面試1v1》G1垃圾回收器

    《面試1v1》G1垃圾回收器

    我是 javapub,一名 Markdown 程序員從?????,八股文種子選手。 面試官 : G1垃圾收集器?聽說很牛逼的樣子! 候選人: 是的,G1是JDK9默認(rèn)的垃圾收集器,代替了CMS收集器。它的目標(biāo)是達(dá)到更高的吞吐量和更短的GC停頓時(shí)間。 面試官 : 聽你一說,我就不高興了!G1到底好在哪兒? 候選

    2024年02月08日
    瀏覽(25)
  • 面試題:JS如何最快的執(zhí)行垃圾回收機(jī)制

    因?yàn)闆]看見答案,所以也不知道對不對。 ? JavaScript 的垃圾回收機(jī)制是由 JavaScript 引擎自動(dòng)管理的,通常情況下我們無法控制垃圾回收機(jī)制的執(zhí)行時(shí)間和頻率。 然而,我們可以采取一些優(yōu)化策略來減少垃圾回收的性能開銷,從而提高代碼執(zhí)行速度。 減少全局變量 :全局變量

    2023年04月13日
    瀏覽(17)
  • java八股文面試[JVM]——垃圾回收器

    java八股文面試[JVM]——垃圾回收器

    jvm結(jié)構(gòu)總結(jié) ? 常見的垃圾回收器有哪些? ? ? CMS(Concurrent Mark Sweep) 整堆收集器 : G1 由于整個(gè)過程中 耗時(shí)最長 的 并發(fā)標(biāo)記 和 并發(fā)清除 過程中,收集器線程都可以與用戶線程一起工作,所以 總體上來說 ,CMS收集器的內(nèi)存回收過程是與用戶線程一起并發(fā)地執(zhí)行。老年代收

    2024年02月11日
    瀏覽(30)
  • JVM——StringTable面試案例+垃圾回收+性能調(diào)優(yōu)+直接內(nèi)存

    JVM——StringTable面試案例+垃圾回收+性能調(diào)優(yōu)+直接內(nèi)存

    JVM——引言+JVM內(nèi)存結(jié)構(gòu)_北嶺山腳鼠鼠的博客-CSDN博客 書接上回內(nèi)存結(jié)構(gòu)——方法區(qū)。 這里常量池是運(yùn)行時(shí)常量池。 intern()方法? intern() 方法用于在運(yùn)行時(shí)將字符串添加到內(nèi)部的字符串池stringtable中,并返回字符串池stringtable中的引用。 返回值 當(dāng)調(diào)用 intern() 方法時(shí),如果字符

    2024年02月12日
    瀏覽(21)
  • 3.Java面試題—JVM基礎(chǔ)、內(nèi)存管理、垃圾回收、JVM 調(diào)優(yōu)

    3.Java面試題—JVM基礎(chǔ)、內(nèi)存管理、垃圾回收、JVM 調(diào)優(yōu)

    一篇文章掌握整個(gè)JVM,JVM超詳細(xì)解析?。。?JVM (Java虛擬機(jī)) 是運(yùn)行 Java 字節(jié)碼 的 虛擬機(jī) 。 JVM 針對 不同系統(tǒng) 有 特定實(shí)現(xiàn) ( Windows 、 Linux 等),目的是 同樣的代碼 在 不同平臺(tái) 能運(yùn)行出 相同的結(jié)果 。 Java 語言 要經(jīng)過 編譯 和 解釋 兩個(gè)步驟: 編譯 :通過 編譯器 將 代碼 一

    2024年02月15日
    瀏覽(23)
  • 【Java基礎(chǔ)】Java對象的生命周期

    【Java基礎(chǔ)】Java對象的生命周期

    一個(gè)類通過編譯器將一個(gè)Java文件編譯為Class字節(jié)碼文件,然后通過JVM中的解釋器編譯成不同操作系統(tǒng)的機(jī)器碼。雖然操作系統(tǒng)不同,但是基于解釋器的虛擬機(jī)是相同的。java類的生命周期就是指一個(gè)class文件加載到類文件注銷整個(gè)過程。 一個(gè)java類的完整的生命周期會(huì)經(jīng)歷加載

    2024年02月12日
    瀏覽(37)
  • Vue面試之生命周期(上篇)

    2024年01月18日
    瀏覽(24)
  • Vue面試之生命周期(下篇)

    最近在整理一些前端面試中經(jīng)常被問到的問題,分為vue相關(guān)、react相關(guān)、js相關(guān)、react相關(guān)等等專題,可持續(xù)關(guān)注后續(xù)內(nèi)容,會(huì)不斷進(jìn)行整理~ 由于Vue3中引入了組合式API的概念,因此在生命周期方面會(huì)有一些變化: ????在Vue3中,引入了“setup”階段作為組件的設(shè)置階段,可以

    2024年01月21日
    瀏覽(25)
  • JVM-JVM中對象的生命周期

    JVM-JVM中對象的生命周期

    申明:文章內(nèi)容是本人學(xué)習(xí)極客時(shí)間課程所寫,文字和圖片基本來源于課程資料,在某些地方會(huì)插入一點(diǎn)自己的理解,未用于商業(yè)用途,侵刪。 原資料地址:課程資料 對象的創(chuàng)建 常量池檢查 :檢查new指令是否能在常量池中定位到這個(gè)類的符號引用,檢查類之前是否被加載過

    2024年02月20日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包