記一次原始碼分析

2022-06-12 16:39:14 字數 1965 閱讀 5607

首先分析一段很短的** 

#include#include

using

namespace

std;

vector

getdata();

//return std::move(v);

returnv;}

intmain()

這段**是錯的,裡面出現了乙個很容易犯得bug/如果函式中有建立本地物件並需要返回時,只能返回物件,不能返回指標或引用,因為函式呼叫完後,這個物件也就會隨之進行析構(釋放),但是如果我們試著返回乙個vector的本地物件時然後對這個本地物件直接呼叫begin()函式得到的卻不是我們想要的,然後我就去單步除錯了/去挑戰

//說明環境 我用的是mingw編譯器 g++

首先進入區域性函式然後構造vector 然後分配記憶體,這個肯定不用多說 廢話不多說 上圖  這裡沒有什麼好說的 呼叫的應該是第乙個沒有任何引數的 allocator

然後就是 呼叫vector的建構函式 因為我寫的形式 initiallist形式 所以選擇的建構函式 也是 這種方式的。

然後就是重點了 敲黑板 這個 建構函式裡面的 範圍初始化函式 我認為很重要 從這張圖也可以看出 vector的主流構造內容主要就是在這了

首先賦予了內容的長度 其實 vector的size()函式返回的就是這個n  對開頭指標進行賦值,然後再對另外兩個賦值 其實 vector的資料定義中都有他們的身影,也就是說自身的某些函式的返回值就是這些 資料

當然下圖只是其中的一部分

接著來 槓tm的

然後上面的那些 複製情況 各自呼叫 各自的函式 也沒啥好說的 直到這一步 這有乙個 不初始化的複製操作 說實話 本屌也不知道這是個啥 但是請記住這裡的位址 總感覺有點不太尋常

到這兒 整個的vector的初始化就結束了 然後呼叫了分配記憶體的析構函式 因為此vector還有用 所以 沒用呼叫他的析構函式

隨後呼叫了 begin()函式 /題外話 c++11的begin()函式 分為兩種 一種是 容器自帶的 另一種是外部的  也就是說你也可以為自己寫的類呼叫官方的begin()函式,但是還是需要寫乙個該容器的內部begin()函式 總之總用不算太大 應該說是個雞肋吧

然後這裡就是很玄學的乙個地方了 這裡誰都知道就是呼叫了  注意看他的 begin裡面呼叫de函式

然後就去析構了 析構了 析構了 /啥玩意兒!

析構完出來就是這樣了

結論: 返回出來的那個位址的確是只想vector的位址,但是vector進行析構了,也就是說在在呼叫完getdata()後,自身的vector就會析構 ,所以這個函式的主要bug還是要將local的生命週期 延長,

方法一: 通過再構造乙個main本地的vector,延長他的週期

方法二:直接對其進行操作取值 比如 這樣 也可以進行延期

cout<

記一次閱讀灰度發布原始碼的感想

最早接觸灰度發布是聽到公司大佬提到的重大上線必須灰度。當時 灰度 這個專業詞語抓住了我的眼球。於是我也開始了對灰度發布的 起初的概念只限於部分讓部分機器上線最新功能,後面就更深化為使用者選取 資料反饋 回滾策略關鍵的三部。直到昨天無意間看到專案中灰度的部分原始碼,又瞬間開始深入研究起來。灰度要實現的...

記一次koa2原始碼的探索經歷

1.本文解決兩個問題,koa啟動的時候需要初始化哪些東西和做了哪些事情?2.一次完整的http請求,對於koa來說是怎麼處理的?3.我們先來回顧一下,我們在使用koa時所使用的一些 const koa require koa 載入koa框架 載入路由 監聽埠號,進行呼叫 logger.info we...

記一次看diff原始碼如何操控虛擬DOM

根據以往經驗 我們先看看snabbdom文件 snabbdom裡有個h 返回了個函式vnode 的結尾返回了乙個vnode函式 其中 sel data children text 都是vue函式裡比較重要的,然後看看vnode.ts裡的 vnode裡 返回了 這麼乙個資料 其中elm 就是vnode...