node c 多執行緒外掛程式 第二天 c 指標

2022-07-14 14:39:21 字數 1977 閱讀 6700

雖然取名叫node多執行緒外掛程式,但是目前還是在學習c++的情況。

今天談一談c++指標。

c++指標就像是c#中的引用變數,例如乙個person類的例項zs。我們知道c#中的引用變數在棧記憶體中開闢了一塊記憶體乙個位址,這個位址是這個物件例項在堆記憶體上的位址,也就是說通過這個引用,系統會去堆記憶體尋找這塊記憶體上的資料。

c++的指標就是這樣的東西,指標本身儲存在棧中,儲存乙個位址,這個位址指向一塊堆記憶體。

目前我用到的c++非指標變數都是存在棧上的,即便是乙個person類的例項物件,比如上面的zs

person zs= person("張三",18,'男');

person zs("張三",18,'男');

上面兩種寫法是一樣的,建立乙個person類的例項,但是和c#不同的是,這些資料是儲存在棧裡面的,因為沒有申請堆記憶體,所以我們自己只能使用棧記憶體。這有點像c#的結構(struct)。

如果要申請堆記憶體,就要使用new去申請

person* zs = new person("張三",18,'男');

通過new出來的東西就是去申請堆記憶體,返回的是該型別的指標。

c++中感覺沒有什麼區別,c#中結構是全儲存在棧中的資料結構,而類是儲存在堆中的資料結構,但在c++中都可以不適用new,從而儲存資料在棧中,也都可以使用new,讓資料儲存在堆中得到這個例項的指標。

當然還是有一些細節差別,這個網上有很多文章,我不再贅述。

c++中沒有自動**這麼一說,所以請求的內存在使用完畢後應該立即**。

這裡提乙個詞:記憶體洩漏,就是指用完的記憶體沒有進行**,比如

while(true),

這句**可能在c#中因為自動**,隔一段時間建立的物件就會被**沒有什麼問題。

在c#中這段**"可能"不會報錯,僅僅是可能,我沒有試過。

但在c++中一定會異常,因為請求的記憶體沒有釋放。

這裡首先要明確一點,需要釋放的記憶體指的是堆記憶體。棧內存在其作用域末尾(即大括號結尾)就被釋放了,但是堆中的記憶體,也就是new的記憶體必須被手動釋放,使用delete關鍵字,刪除指標所指向的物件,即釋放該物件占用的記憶體

delete zs;

但要注意一點,被釋放的記憶體僅僅是物件本身的記憶體,如果物件有指標成員,這個成員是不會被釋放的。

zs->child ---> person* zhangsi//假設person物件有乙個屬性child,是乙個person型別的指標

這個指標指向的記憶體並不會因為zs的釋放而被自動釋放。

person* zhangsan=new person("張三",28,'男');

person* zhangsi=new person("張四",3,'男');

zhangsan->child=zhangsi;

delete zhangsan;

cout<< zhangsi->name name《如果沒有注意到這一點,還是會造成記憶體洩漏。所以如果要聯級刪除,就需要在析構函式裡進行刪除。但是可能存在別的地方需要用到這個指標,所以這裡使用智慧型指標。說起來比較麻煩,到這裡我自己也不是很懂了。

這對於我在做的這個外掛程式是乙個挑戰。怎麼說呢,首先我從來沒有接觸過這種自己釋放記憶體的語言,所以還要花時間去摸索,其次假如子執行緒異常了怎麼辦。關於後者,我覺得應該沒有問題,只要把錯誤控制在js的層面上就不會出什麼錯。但是c++的層面還需要去維護。

現在想到的問題如下:

1、v8函式執行問題,因為谷歌被牆了,國內也沒有什麼資料,v8的一些東西並不是很懂。

2、async/await被喚醒後的執行問題。這點可能要重寫async/await關鍵字,主要是考慮到await後的執行區域最終被主線程接管了還是子執行緒在執行,這點要實驗後才知道。

3、執行緒強制退出的資源**問題。關於這一點,如果執行緒執行的js函式異常,只需要進行封裝讓他不會異常就行了,但是如果在c++層面上呼叫了terminate函式怎麼釋放資源。目前想法是直接不允許呼叫這個函式

4、執行緒間鎖的問題。關於這點可以考慮使用c++11標準庫的thread和mutex

今天內容如上,明天來研究v8的東西

劍指offer第二天

分析b i a 0 a 1 a i 1 a i 1 a n 1 得 從左到右算 b i a 0 a 1 a i 1 從右到左算b i a i 1 a n 1 public int multiply int a temp 1 for int k len 1 k 0 temp a k return b ...

C 學習第二天

方法的可選引數 static void main string args static void testinfo int a 158,int b 10,float f 0.8f b f a,b,f 下面這個方法中形式引數a為必選引數,換句話說當呼叫該方法時,至少是int a 118 testinf...

C 第二天學習

1.今天oj上開了 類 專題的題,做了幾個簡單的題,感覺上面的題還是比較水的,不過b題還是wa了4次。然後又看了一下課本上關於類的知識點,覺得類這種資料形式使資訊隱藏變得現實,只有類裡public下的函式可以使用private下的資料,如果沒有介面的話,這樣的乙個類就真的 隱藏 了。不過這樣就沒意義...