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

C++面試八股文:如何在堆上和棧上分配一塊內(nèi)存?

這篇具有很好參考價(jià)值的文章主要介紹了C++面試八股文:如何在堆上和棧上分配一塊內(nèi)存?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位6面:

面試官: 如何在堆上申請(qǐng)一塊內(nèi)存?

二師兄:常用的方法有malloc,new等。

面試官:兩者有什么區(qū)別?

二師兄:malloc是向操作系統(tǒng)申請(qǐng)一塊內(nèi)存,這塊內(nèi)存沒(méi)有經(jīng)過(guò)初始化,通常需要使用memset手動(dòng)初始化。而new一般伴隨三個(gè)動(dòng)作,向操作系統(tǒng)申請(qǐng)一塊內(nèi)存,并執(zhí)行類型的默認(rèn)構(gòu)造函數(shù),然后返回類的指針。

面試官:嗯,那你知道calloc和realloc嗎?

二師兄:calloc比malloc多做了一步,就是把申請(qǐng)的內(nèi)存初始化成0。而realloc則可以改變當(dāng)前指針?biāo)赶虻膬?nèi)存塊的大小。

面試官:好的。那么你知道這些api/操作符失敗會(huì)發(fā)生什么嗎?

二師兄:malloc/calloc/realloc失敗會(huì)返回NULL,而new失敗則會(huì)拋出異常。

面試官:有沒(méi)有讓new失敗不拋出異常的方法?

二師兄:好像有,但是我不記得了。。。

面試官:沒(méi)關(guān)系。。。我們都知道new和delete成對(duì)出現(xiàn),new[]和delete[]也是成對(duì)出現(xiàn),那么我想問(wèn),如果使用new[]創(chuàng)建的對(duì)象用delete釋放了會(huì)發(fā)生什么?為什么?

二師兄:額。。。內(nèi)存泄漏?對(duì),會(huì)發(fā)生內(nèi)存泄漏。因?yàn)閮?nèi)存沒(méi)有被釋放。

面試官:好的。我們都知道C++中的內(nèi)存管理是一個(gè)比較麻煩的事情,現(xiàn)在有個(gè)需求,需要在程序中記錄主動(dòng)申請(qǐng)的內(nèi)存和主動(dòng)釋放的內(nèi)存,以確保沒(méi)有發(fā)生內(nèi)存泄漏。有什么好的方法嗎?

二師兄:可以重載new和delete運(yùn)算符。

面試官:如何重載new和delete運(yùn)算符?

二師兄:我得查一下資料,這個(gè)重載用的很少。。。

面試官:(笑)好吧,最后一個(gè)問(wèn)題,咱們上面一直在討論堆中的內(nèi)存的分配和釋放,請(qǐng)問(wèn)一下,如果在棧上分配一塊固定的內(nèi)存?棧中的內(nèi)存如何釋放?

二師兄:額。。。(思考)使用 char[size] ? 應(yīng)該不需要手動(dòng)釋放。

面試官:好的,回去等通知吧。

對(duì)于二師兄的表現(xiàn),小伙伴們能給打幾分呢?我們先看看二師兄在面試中表現(xiàn)不太好的地方:

面試官:有沒(méi)有讓new失敗不拋出異常的方法?

在C++中我們可以使用以下方法使得new運(yùn)算符不拋出異常,

int* p = new (std::nothrow) int(42);
if(p == nullptr)
{
    //分配失敗
}

這個(gè)特性需要C++11支持。

再看下一個(gè)問(wèn)題:

如果使用new[]創(chuàng)建的對(duì)象用delete釋放了會(huì)發(fā)生什么?

一定會(huì)發(fā)生內(nèi)存泄漏嗎?答案是,不一定。這取決于類型T。我們先看第一種情況:

class Foo
{
public:
    Foo():num_(42){}
private:
    int num_;
};

Foo* pf = new Foo[1024];
delete pf;

當(dāng)類型T沒(méi)有管理資源時(shí),delete pf會(huì)把整個(gè)申請(qǐng)的1024個(gè)Foo所占用的內(nèi)存全部歸還給操作系統(tǒng),此時(shí)并沒(méi)有內(nèi)存泄漏。再看下一種情況:

class Foo
{
public:
    Foo():num_(new int(42)){}
    ~Foo(){delete num_;}
private:
    int* num_;
};

Foo* pf = new Foo[1024];
delete pf; 

此時(shí)會(huì)造成內(nèi)存泄漏,原因很簡(jiǎn)單。在執(zhí)行delete[]時(shí),首先逆序執(zhí)行每個(gè)元素的析構(gòu)函數(shù),然后再把整塊內(nèi)存歸還給操作系統(tǒng)。而delete只會(huì)把內(nèi)存還給操作系統(tǒng),沒(méi)有執(zhí)行析構(gòu)函數(shù)。當(dāng)類沒(méi)有資源需要管理時(shí),執(zhí)行與不執(zhí)行析構(gòu)函數(shù)都無(wú)關(guān)緊要,但是當(dāng)類中需要管理資源時(shí),析構(gòu)函數(shù)的執(zhí)行就至關(guān)重要了。

如何重載new和delete運(yùn)算符?

#include <iostream>
#include <cstdlib>
#include <map>
struct MemoryInfo {
    size_t size;
    const char* file;
    int line;
};

std::map<void*, MemoryInfo> memoryMap;

void* operator new(size_t size, const char* file, int line) {
    void* ptr = std::malloc(size);
    memoryMap[ptr] = {size, file, line};
    return ptr;
}

void operator delete(void* ptr) noexcept {
    auto it = memoryMap.find(ptr);
    if (it != memoryMap.end()) {
        std::free(ptr);
        memoryMap.erase(it);
    }
}

#define new new(__FILE__, __LINE__)

int main() {
    int* p = new int(42);

    for (const auto& [ptr, info] : memoryMap) {
        std::cout << "Memory allocated at " << ptr << " with size " << info.size
                  << " in file " << info.file << " at line " << info.line << std::endl;
    }
    
    delete p;
    
    for (const auto& [ptr, info] : memoryMap) {
        std::cout << "Memory allocated at " << ptr << " with size " << info.size
                  << " in file " << info.file << " at line " << info.line << std::endl;
    }
    return 0;
}

最后一個(gè)問(wèn)題:

如果在棧上分配一塊固定的內(nèi)存?棧中的內(nèi)存如何釋放?

使用alloca,雖然簡(jiǎn)單,但是很多人可能都沒(méi)有接觸過(guò):

int* p = (int*)alloca(4);
*p = 42;

棧上申請(qǐng)的內(nèi)存不需要手動(dòng)釋放。注意,如果棧溢出,alloca的行為時(shí)未定義的。

好了,今日份面試到這里就結(jié)束了,小伙伴們,對(duì)于今天二師兄的面試,能打幾分呢?

關(guān)注我,帶你21天“精通”C++!(狗頭)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-472313.html

到了這里,關(guān)于C++面試八股文:如何在堆上和棧上分配一塊內(nèi)存?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • C++面試八股文:std::vector和std::list,如何選擇?

    C++面試八股文:std::vector和std::list,如何選擇?

    某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第24面: 面試官: list 用過(guò)嗎? 二師兄:嗯,用過(guò)。 面試官:請(qǐng)講一下 list 的實(shí)現(xiàn)原理。 二師兄: std::list 被稱為雙向鏈表,和C中手寫雙向鏈表本質(zhì)上沒(méi)有大的區(qū)別。 list 對(duì)象中有兩個(gè)指針,一個(gè)指向上一個(gè)節(jié)點(diǎn)( node ),一

    2024年02月10日
    瀏覽(15)
  • C++面試八股文:技術(shù)勘誤

    C++面試八股文:技術(shù)勘誤

    不知不覺(jué),《C++面試八股文》已經(jīng)更新30篇了,這是我第一次寫技術(shù)博客,由于個(gè)人能力有限,出現(xiàn)了不少紕漏,在此向各位讀者小伙伴們致歉。 為了不誤導(dǎo)更多的小伙伴,以后會(huì)不定期的出勘誤文章,請(qǐng)各位小伙伴留意。 在《C++面試八股文:C++中,設(shè)計(jì)一個(gè)類要注意哪些東

    2024年02月11日
    瀏覽(29)
  • C++面試八股文:什么是構(gòu)造函數(shù)?

    某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第29面: 面試官:什么是構(gòu)造函數(shù)? 二師兄:構(gòu)造函數(shù)是一種特殊的成員函數(shù),用于創(chuàng)建和初始化類的對(duì)象。構(gòu)造函數(shù)的名稱與類的名稱相同,并且沒(méi)有返回類型。構(gòu)造函數(shù)在對(duì)象被創(chuàng)建時(shí)自動(dòng)調(diào)用。 面試官:什么是默認(rèn)構(gòu)造

    2024年02月11日
    瀏覽(26)
  • C++面試八股文:了解位運(yùn)算嗎?

    某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第12面: 面試官:了解位運(yùn)算嗎? 二師兄:了解一些。(我很熟悉) 面試官:請(qǐng)列舉以下有哪些位運(yùn)算? 二師兄:按位與( )、按位或( | )、按位異或( ^ ),按位取反( ~ )、左移( )和右移( )。 面試官:好的。那你

    2024年02月08日
    瀏覽(23)
  • C++面試八股文:什么是RAII?

    某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第13面: 面試官:什么是 RAII ? 二師兄: RAII 是 Resource Acquisition Is Initialization 的縮寫。翻譯成中文是資源獲取即初始化。 面試官: RAII 有什么特點(diǎn)和優(yōu)勢(shì)? 二師兄:主要的特點(diǎn)是,在對(duì)象初始化時(shí)獲取資源,在對(duì)象析構(gòu)時(shí)釋放

    2024年02月08日
    瀏覽(27)
  • C++面試八股文:什么是智能指針?

    C++面試八股文:什么是智能指針?

    某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第19面: 面試官:什么是智能指針? 二師兄:智能指針是C++11引入的類模板,用于管理資源,行為類似于指針,但不需要手動(dòng)申請(qǐng)、釋放資源,所以稱為智能指針。 面試官:C++11引入了哪些智能指針? 二師兄:三種,分別是 s

    2024年02月09日
    瀏覽(24)
  • C++面試八股文:聊一聊指針?

    C++面試八股文:聊一聊指針?

    某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第17面: 面試官:聊一聊指針? 二師兄:好的。 面試官:你覺(jué)得指針本質(zhì)上是什么? 二師兄:這要從內(nèi)存地址開(kāi)始說(shuō)起了。如果有一塊容量是1G的內(nèi)存,假設(shè)它的地址是從 0x00000000 到 0x3fffffff ,每一個(gè)字節(jié)都對(duì)應(yīng)一個(gè)地址。當(dāng)

    2024年02月09日
    瀏覽(24)
  • C++面試八股文:用過(guò)STL嗎?

    某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第21面: 面試官:用過(guò)STL嗎? 二師兄:(每天都用好嗎。。)用過(guò)一些。 面試官:你知道STL是什么? 二師兄:STL是指標(biāo)準(zhǔn)模板庫(kù)( Standard Template Library ),是C++區(qū)別于C語(yǔ)言的特征之一。 面試官:那你知道STL的六大部件是什么

    2024年02月09日
    瀏覽(15)
  • C++面試八股文:std::vector了解嗎?

    某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第23面: 面試官: vector 了解嗎? 二師兄:嗯,用過(guò)。 面試官:那你知道 vector 底層是如何實(shí)現(xiàn)的嗎? 二師兄: vector 底層使用動(dòng)態(tài)數(shù)組來(lái)存儲(chǔ)元素對(duì)象,同時(shí)使用 size 和 capacity 記錄當(dāng)前元素的數(shù)量和當(dāng)前動(dòng)態(tài)數(shù)組的容量。如果

    2024年02月10日
    瀏覽(28)
  • C++面試八股文:std::deque用過(guò)嗎?

    C++面試八股文:std::deque用過(guò)嗎?

    某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第26面: 面試官: deque 用過(guò)嗎? 二師兄:說(shuō)實(shí)話,很少用,基本沒(méi)用過(guò)。 面試官:為什么? 二師兄:因?yàn)槭褂盟膱?chǎng)景很少,大部分需要性能、且需要自動(dòng)擴(kuò)容的時(shí)候使用 vector ,需要隨機(jī)插入和刪除的時(shí)候可以使用 list 。

    2024年02月11日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包