C 和 C++ 區(qū)別
- C語言是面向過程的編程恨诱,C++是面向?qū)ο蟮木幊?/li>
- C中變量聲明和代碼是分開的,必須在函數(shù)開始處聲明许师;
C++中,變量可以在任意處聲明颊郎,只要保證先聲名后使用的原則就可以。 - C++中有bool(或boolean類型);C中可沒有這樣的bool類型霎苗,均為數(shù)值類型
- C語言中函數(shù)沒有參數(shù)默認值姆吭,在C++中函數(shù)有參數(shù)默認值的概念
- C++ 引用概念 int& a =b
cpp 分配內(nèi)存的幾種方式
cpp 類的大小
對象是類類型的一個變量,類則是對象的模板
類是抽象的唁盏,不占用存儲空間内狸;而對象是具體的,占用存儲空間
c++ 對象內(nèi)存分布
最權(quán)威結(jié)論是:非靜態(tài)成員變量總和加上編譯器為了CPU計算做出的數(shù)據(jù)對齊處理和支持虛函數(shù)所產(chǎn)生的負擔(dān)的總和
C++ 中每個空類型的實例(類為空的對象)占1Byte空間
靜態(tài)數(shù)據(jù)成員是不占對象的內(nèi)存空間的
成員函數(shù)不占空間
構(gòu)造函數(shù)和析構(gòu)函數(shù)不占空間
編譯器為了支持虛函數(shù)厘擂,會產(chǎn)生額外的負擔(dān)昆淡,這正是指向虛函數(shù)表的指針的大小
函數(shù)代碼段是公用的,即如果一個類定義了10個對象驴党,這些對象的成員函數(shù)所對應(yīng)的是同一個函數(shù)代碼段瘪撇,而不是10個不同的函數(shù)代碼段
引用和指針區(qū)別
本質(zhì)上的區(qū)別是,指針是一個新的變量港庄,只是這個變量存儲的是另一個變量的地址倔既,我們通過訪問這個地址來修改變量。
引用只是一個別名鹏氧,還是變量本身渤涌。對引用進行的任何操作就是對變量本身進行操作,因此以達到修改變量的目的
(1)指針:指針是一個變量把还,只不過這個變量存儲的是一個地址实蓬,指向內(nèi)存的一個存儲單元;
而引用跟原來的變量實質(zhì)上是同一個東西吊履,只不過是原變量的一個別名而已安皱。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定義了一個整形變量和一個指針變量p,該指針變量指向a的存儲單元艇炎,即p的值是a存儲單元的地址酌伊。
而下面2句定義了一個整形變量a和這個整形a的引用b,事實上a和b是同一個東西缀踪,在內(nèi)存占有同一個存儲單元居砖。
(2)可以有const指針,但是沒有const引用(const引用可讀不可改驴娃,與綁定對象是否為const無關(guān))
(3)指針可以有多級奏候,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)
(4)指針的值可以為空唇敞,但是引用的值不能為NULL蔗草,并且引用在定義的時候必須初始化咒彤;
(5)指針的值在初始化后可以改變,即指向其它的存儲單元蕉世,而引用在進行初始化后就不會再改變了蔼紧。
(6)"sizeof引用"得到的是所指向的變量(對象)的大小,而"sizeof指針"得到的是指針本身的大泻萸帷;
(7)指針和引用的自增(++)運算意義不一樣彬犯;
- 面向?qū)ο笕筇匦?封裝向楼,繼承,多態(tài))谐区;什么時候會用到多態(tài)
C++多態(tài)性主要是通過虛函數(shù)實現(xiàn)的湖蜕,虛函數(shù)允許子類重寫
應(yīng)用程序不必為每一個派生類編寫功能調(diào)用,只需要對抽象基類進行處理即可宋列。大大提高程序的可復(fù)用性昭抒。//繼承
派生類的功能可以被基類的方法或引用變量所調(diào)用,這叫向后兼容炼杖,可以提高可擴充性和可維護性灭返。 //多態(tài)的真正作用
- cpp 虛函數(shù),純虛函數(shù)坤邪,虛函數(shù)表
虛函數(shù)與虛繼承尋蹤
虛函數(shù)的作用是允許在派生類中重新定義與基類同名的函數(shù)熙含,并且可以通過基類指針或引用來訪問基類和派生類中的同名函數(shù)
純虛函數(shù)是在基類中聲明的虛函數(shù),它在基類中沒有定義艇纺,但要求任何派生類都要定義自己的實現(xiàn)方法怎静。同時含有純虛函數(shù)的類稱為抽象類,它不能生成對象 - 一個復(fù)雜的類繼承+虛函數(shù)+成員變量黔衡,問類的內(nèi)存分布
- 虛表指針指的是什么蚓聘,那個復(fù)雜類里面的虛表,他的結(jié)構(gòu)是什么樣的
- stl 用過嗎盟劫;vector和list的優(yōu)缺點(優(yōu)缺點都要說)夜牡,什么時候用vector,什么時候用list
如果你需要高效的隨即存取,而不在乎插入和刪除的效率捞高,使用vector
如果你需要大量的插入和刪除氯材,而不關(guān)心隨即存取,則應(yīng)使用list
如果你需要隨即存取硝岗,而且關(guān)心兩端數(shù)據(jù)的插入和刪除氢哮,則應(yīng)使用deque - vector, list, map, hashmap 底層原理和各種功能復(fù)雜度
c++ list, vector, map, set 區(qū)別與用法比較 - 創(chuàng)建一個 vector<int> ,里面存了 5 個元素型檀,1 2 3 4 5 把迭代器指向5冗尤,然后在vector最前面插入一個0,問剛才那個迭代器指向幾 4
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> aa;
aa.push_back(1);
aa.push_back(2);
aa.push_back(3);
aa.push_back(4);
aa.push_back(5);
vector<int>::iterator it = aa.end()-1;
cout<<*it<<endl; // 5
aa.insert(aa.begin(), 1, 0); // 在最前面插入一個0
vector<int>::iterator tt;
for(tt = aa.begin(); tt != aa.end(); tt++){
cout<<*tt<<" "; // 0 1 2 3 4 5
}
cout<<*it<<endl; // 4
}
- 創(chuàng)建一個 vector<int> ,里面存了 5 個元素裂七,1 2 3 4 5 把迭代器指向3皆看,然后在vector中刪除 3 ,問剛才那個迭代器指向幾 4
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> aa;
aa.push_back(1);
aa.push_back(2);
aa.push_back(3);
aa.push_back(4);
aa.push_back(5);
vector<int>::iterator it = aa.end()-3;
cout<<*it<<endl; // 3
aa.erase(it);
cout<<*it<<endl; // 4
vector<int>::iterator tt;
for(tt = aa.begin(); tt != aa.end(); tt++){
cout<<*tt<<" "; // 1 2 4 5
}
cout<<endl;
}
為什么vector的插入操作可能會導(dǎo)致迭代器失效背零?
vector動態(tài)增加大小時腰吟,并不是在原空間后增加新的空間,而是以原大小的兩倍在另外配置一片較大的新空間徙瓶,然后將內(nèi)容拷貝過來毛雇,并釋放原來的空間。由于操作改變了空間侦镇,所以迭代器失效灵疮。vector的內(nèi)存分配了解嗎?a是vector的一個元素壳繁,&a傳參可以嗎震捣?為什么?
最好不要闹炉,vector動態(tài)分配內(nèi)存蒿赢,如果vector擴容原來的地址失效什么是迭代器失效
C++ 迭代器失效
容器元素整體“遷移”導(dǎo)致存放原容器元素的空間不再有效,從而使得指向原空間的迭代器失效剩胁。
刪除元素使得某些元素次序發(fā)生變化使得原本指向某元素的迭代器不再指向希望指向的元素诉植。智能指針 shared_ptr 和 weak_ptr 使用方式,為什么這么用昵观;auto_ptr為什么被廢了晾腔,和 shared_ptr 區(qū)別
STL一共給我們提供了四種智能指針:auto_ptr、unique_ptr啊犬、shared_ptr和weak_ptr灼擂,其中后三個是c++11支持,并且第一個已經(jīng)被c++11棄用觉至。
第一種智能指針是shared_ptr,它有一個叫做共享所有權(quán)(sharedownership)的概念剔应。shared_ptr的目標非常簡單:多個指針可以同時指向一個對象,當(dāng)最后一個shared_ptr離開作用域時语御,內(nèi)存才會自動釋放峻贮。
如果需要共享資源使用shared_ptr,如果獨占使用資源就使用unique_ptr.
c++ 智能指針用法詳解
C++ 智能指針
C++11 智能指針
為什么要使用智能指針:我們知道c++的內(nèi)存管理是讓很多人頭疼的事,當(dāng)我們寫一個new語句時应闯,一般就會立即把delete語句直接也寫了纤控,但是我們不能避免程序還未執(zhí)行到delete時就跳轉(zhuǎn)了或者在函數(shù)中沒有執(zhí)行到最后的delete語句就返回了,如果我們不在每一個可能跳轉(zhuǎn)或者返回的語句前釋放資源碉纺,就會造成內(nèi)存泄露船万。使用智能指針可以很大程度上的避免這個問題刻撒,因為智能指針就是一個類,當(dāng)超出了類的作用域是耿导,類會自動調(diào)用析構(gòu)函數(shù)声怔,析構(gòu)函數(shù)會自動釋放資源
write/read 和 mmap 區(qū)別,零拷貝之類舱呻,mmap如何實現(xiàn)
read()是系統(tǒng)調(diào)用醋火,其中進行了數(shù)據(jù)拷貝,它首先將文件內(nèi)容從硬盤拷貝到內(nèi)核空間的一個緩沖區(qū)箱吕,然后再將這些數(shù)據(jù)拷貝到用戶空間,在這個過程中胎撇,實際上完成了兩次數(shù)據(jù)拷貝 ;
而mmap()也是系統(tǒng)調(diào)用殖氏,如前所述,mmap()中沒有進行數(shù)據(jù)拷貝姻采,真正的數(shù)據(jù)拷貝是在缺頁中斷處理時進行的雅采,由于mmap()將文件直接映射到用戶空間,所以中斷處理函數(shù)根據(jù)這個映射關(guān)系慨亲,直接將文件從硬盤拷貝到用戶空間婚瓜,只進行了 一次數(shù)據(jù)拷貝。因此刑棵,內(nèi)存映射的效率要比read/write效率高巴刻。
內(nèi)存映射文件原理探索
mmap與read/write的區(qū)別cpu 大端、小端存儲
大端模式:高位字節(jié)排放在內(nèi)存的低地址端蛉签,低位字節(jié)排放在內(nèi)存的高地址端
小端模式:低位字節(jié)排放在內(nèi)存的低地址端胡陪,高位字節(jié)排放在內(nèi)存的高地址端
比如數(shù)字 0x12345678 在兩種不同字節(jié)序 CPU 中的存儲順序如下所示
1)大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
為什么要注意字節(jié)序的問題呢?
如果程序只在單機環(huán)境下運行碍舍,并且不和其他程序打交道柠座,那么完全可以忽略字節(jié)序的存在;
但是片橡,如果程序要跟其他程序產(chǎn)生交互呢妈经,此時就一定需要注意寫字節(jié)序的問題。C/C++ 語言編寫的程序里數(shù)據(jù)存儲順序是跟編譯平臺所在 CPU 相關(guān)的捧书,而 JAVA 編寫的程序則唯一采用 大端模式 來存儲數(shù)據(jù)吹泡。
試想,如果你用 C/C++ 語言在 x86 平臺下編寫的程序跟別人的 JAVA 程序互通時會產(chǎn)生什么結(jié)果? 就拿上面的 0x12345678 來說经瓷,將指向 0x12345678 的指針指向 JAVA 程序爆哑,由于 JAVA 采用大端方式存儲數(shù)據(jù),很自然會將你的數(shù)據(jù)翻譯成 0x78563412 了嚎。因此泪漂,在你的 C 程序傳給 JAVA 程序之前有必要進行字節(jié)序的轉(zhuǎn)換工作
無獨有偶廊营,所有網(wǎng)絡(luò)協(xié)議也都是采用大端模式來傳輸數(shù)據(jù)。所以有時也會把大端方式稱之為網(wǎng)絡(luò)字節(jié)序萝勤。當(dāng)兩臺采用不同字節(jié)序的主機通信時露筒,在發(fā)送數(shù)據(jù)之前都必須經(jīng)過字節(jié)序的轉(zhuǎn)換成為網(wǎng)絡(luò)字節(jié)序后再進行傳輸
內(nèi)存對齊,怎么修改對齊基數(shù)
內(nèi)存對齊到底是怎么回事敌卓?
pragma pack 的主要作用就是改變編譯器的內(nèi)存對齊方式慎式,這個指令在網(wǎng)絡(luò)報文的處理中有著重要的作用,#pragma pack(n) 是他最基本的用法趟径,其作用是改變編譯器的對齊方式瘪吏, 不使用這條指令的情況下,編譯器默認采取#pragma pack(8)也就是8字節(jié)的默認對齊方式蜗巧,n值可以日泼摺(1, 2幕屹, 4蓝丙, 8, 16) 中任意一值望拖。struct 的字節(jié)對齊問題
1渺尘、類型的長度和數(shù)據(jù)成員對齊:在第一個成員之后,每個成員距離struct 首地址的距離 offset 说敏,都是 struct 內(nèi)成員自身(sizeof) 與 #pragma pack(n) 中的 n 的最小值的整數(shù)倍鸥跟,如果未經(jīng)對其時不滿足這個規(guī)則,在對齊時就會在這個成員前填充空字節(jié)以使其達到數(shù)據(jù)成員對齊
2盔沫、整體對齊:編譯器在進行數(shù)據(jù)成員對齊之后医咨,還要進行整體對齊。與數(shù)據(jù)對齊相似但不是完全相同迅诬,如果數(shù)據(jù)對齊完成時 struct 的大小不是 struct 內(nèi)成員自身長度最大值(sizeof) 與 #pragma pack(n) 中的 n 的最小值的整數(shù)倍腋逆。(注意這里是成員中長度最大的那個與n比較,而不是特定的一個成員侈贷。)就要在struct的最后添加空字節(jié)直到對齊惩歉。-
class 和 struct 區(qū)別,class 怎么防止繼承俏蛮,
C++ 中保留了C語言的 struct 關(guān)鍵字撑蚌,并且加以擴充。在C語言中搏屑,struct 只能包含成員變量争涌,不能包含成員函數(shù)。而在C++中辣恋,struct 類似于 class亮垫,既可以包含成員變量模软,又可以包含成員函數(shù)。
總的來說饮潦,struct 更適合看成是一個數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)體燃异,class 更適合看成是一個對象的實現(xiàn)體。最本質(zhì)的一個區(qū)別就是默認的訪問控制- 默認的繼承訪問權(quán)限继蜡。struct 是 public 的回俐,class 是 private 的。
- struct 作為數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)體稀并,它默認的數(shù)據(jù)訪問控制是 public 的仅颇,而 class 作為對象的實現(xiàn)體,它默認的成員變量訪問控制是 private 的碘举。
在編寫C++代碼時忘瓦,我強烈建議使用 class 來定義類,而使用 struct 來定義結(jié)構(gòu)體引颈,這樣做語義更加明確政冻。
預(yù)編譯
預(yù)處理器的主要作用就是把通過預(yù)處理的內(nèi)建功能對一個資源進行等價替換,
最常見的預(yù)處理有:文件包含线欲,條件編譯、布局控制和宏替換4種汽摹。
文件包含:
#include 是一種最為常見的預(yù)處理李丰,主要是做為文件的引用組合源程序正文。
條件編譯:
#if逼泣,#ifndef趴泌,#ifdef,#endif拉庶,#undef等也是比較常見的預(yù)處理嗜憔,主要是進行編譯時進行有選擇的挑選,
注釋掉一些指定的代碼氏仗,以達到版本控制吉捶、防止對文件重復(fù)包含的功能。
布局控制:
#progma皆尔,這也是我們應(yīng)用預(yù)處理的一個重要方面呐舔,主要功能是為編譯程序提供非常規(guī)的控制流信息。
宏替換:
#define慷蠕,這是最常見的用法珊拼,它可以定義符號常量、函數(shù)功能流炕、重新命名澎现、字符串的拼接等各種功能仅胞。
c++ 11 新特性
十大必掌握C++11新特性
C++11新特性梳理
新增基于范圍的for循環(huán)
自動類型推斷 auto
匿名函數(shù) Lambda
顯示重寫(覆蓋)override和final
空指針常量 nullptr
long long int類型
線程支持
智能指針拷貝構(gòu)造函數(shù)和拷貝賦值函數(shù)的區(qū)別
調(diào)用的是拷貝構(gòu)造函數(shù)還是賦值運算符,主要是看是否有新的對象實例產(chǎn)生剑辫。如果產(chǎn)生了新的對象實例干旧,那調(diào)用的就是拷貝構(gòu)造函數(shù);如果沒有揭斧,那就是對已有的對象賦值莱革,調(diào)用的是賦值運算符。
拷貝構(gòu)造函數(shù)必須以引用的方式傳遞參數(shù)對于一個空類讹开,編譯器默認生成四個成員函數(shù):默認構(gòu)造函數(shù)盅视、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)旦万、賦值函數(shù)
析構(gòu)函數(shù)為何要是虛函數(shù)闹击?
基類,派生類成艘∩桶耄基類析構(gòu)是非虛函數(shù),則派生類銷毀時淆两,只會調(diào)用基類析構(gòu)函數(shù)断箫,不會調(diào)用派生類析構(gòu)函數(shù),會造成資源泄露秋冰,損壞數(shù)據(jù)結(jié)構(gòu)仲义。然而,是虛函數(shù)可以避免此問題剑勾。C++構(gòu)造函數(shù)不能為虛函數(shù)
從存儲空間角度埃撵,虛函數(shù)對應(yīng)一個指向vtable虛函數(shù)表的指針,這大家都知道虽另,可是這個指向vtable的指針其實是存儲在對象的內(nèi)存空間的暂刘。問題出來了,如果構(gòu)造函數(shù)是虛的捂刺,就需要通過 vtable來調(diào)用谣拣,可是對象還沒有實例化,也就是內(nèi)存空間還沒有族展,怎么找vtable呢芝发?所以構(gòu)造函數(shù)不能是虛函數(shù)。define 和 const 區(qū)別
在C++ 中苛谷,可以用const來定義常量辅鲸,也可以用 #define來定義常量。但是前者比后者有更多的優(yōu)點:
const常量有數(shù)據(jù)類型腹殿,而宏常量沒有數(shù)據(jù)類型独悴。
編譯器可以對前者進行類型安全檢查例书。而對后者只進行字符替換,沒有類型安全檢查刻炒,并且在字符替換可能會產(chǎn)生意料不到的錯誤(邊際效應(yīng))决采。構(gòu)造函數(shù)能否拋異常?最好不要坟奥,否則容易內(nèi)存泄露
協(xié)程的概念
協(xié)程的概念總結(jié)
協(xié)程就是類函數(shù)一樣的程序組件树瞭,你可以在一個線程里面輕松創(chuàng)建數(shù)十萬個協(xié)程,就像數(shù)十萬次函數(shù)調(diào)用一樣常用的調(diào)試方法和工具:GDB
gdb 是 gcc 的調(diào)試工具爱谁,主要用于C與C++ 這兩種語言編寫的程序晒喷。它的功能很強大,主要體現(xiàn)在以下4點访敌。1)啟動程序時凉敲,可以按照用戶自定義的要求隨心所欲地運行程序;2)可讓被調(diào)試的程序在指定的斷點處停止寺旺;3)當(dāng)程序被停住時爷抓,可以檢查此時程序中的運行狀態(tài);4)動態(tài)地改變程序的執(zhí)行環(huán)境new和malloc區(qū)別
1阻塑、 申請的內(nèi)存所在位置
new操作符從自由存儲區(qū)(free store)上為對象動態(tài)分配內(nèi)存空間蓝撇,而malloc函數(shù)從堆上動態(tài)分配內(nèi)存
2、返回類型安全性
new操作符內(nèi)存分配成功時陈莽,返回的是對象類型的指針唉地,類型嚴格與對象匹配,無須進行類型轉(zhuǎn)換传透,故new是符合類型安全性的操作符。而malloc內(nèi)存分配成功則是返回void * 极颓,需要通過強制類型轉(zhuǎn)換將void*指針轉(zhuǎn)換成我們需要的類型朱盐。
3、內(nèi)存分配失敗時的返回值
new內(nèi)存分配失敗時菠隆,會拋出bac_alloc異常兵琳,它不會返回NULL;malloc分配內(nèi)存失敗時返回NULL骇径。
4躯肌、是否需要指定內(nèi)存大小
使用new操作符申請內(nèi)存分配時無須指定內(nèi)存塊的大小,編譯器會根據(jù)類型信息自行計算破衔,而malloc則需要顯式地指出所需內(nèi)存的尺寸
5清女、是否調(diào)用構(gòu)造函數(shù)/析構(gòu)函數(shù)
new/delete會調(diào)用對象的構(gòu)造函數(shù)/析構(gòu)函數(shù)以完成對象的構(gòu)造/析構(gòu)。而malloc則不會
6晰筛、對數(shù)組的處理
C++提供了new[]與delete[]來專門處理數(shù)組類型:
至于malloc嫡丙,它并知道你在這塊內(nèi)存上要放的數(shù)組還是啥別的東西拴袭,反正它就給你一塊原始的內(nèi)存,在給你個內(nèi)存的地址就完事曙博。所以如果要動態(tài)分配一個數(shù)組的內(nèi)存拥刻,還需要我們手動自定數(shù)組的大小函數(shù)指針與指針函數(shù)辨別
函數(shù)指針是指向函數(shù)的指針變量,即本質(zhì)是一個指針變量父泳。
指針函數(shù)是指帶指針的函數(shù)般哼,即本質(zhì)是一個函數(shù)。函數(shù)返回類型是某一類型的指針引用是否能實現(xiàn)動態(tài)綁定惠窄,為什么引用可以實現(xiàn)
因為對象的類型是確定的蒸眠,在編譯期就確定了
指針或引用是在運行期根據(jù)他們綁定的具體對象確定STL 中 vector 中 reserve() 和 resize() 區(qū)別
resize()函數(shù)的作用是改變vector元素個數(shù)
reverse() 函數(shù)的作用是改變?nèi)萘?/p>指針常量 vs 常量指針
指針常量 int *const p
常量指針 const int *p / int const *p
類是抽象的睬捶,不占用存儲空間黔宛;而對象是具體的,占用存儲空間
內(nèi)存泄漏:在計算機科學(xué)中擒贸,內(nèi)存泄漏指由于疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況臀晃。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后介劫,由于設(shè)計錯誤徽惋,導(dǎo)致在釋放該段內(nèi)存之前就失去了對該段內(nèi)存的控制,從而造成了內(nèi)存的浪費座韵。
最難捉摸也最難檢測到的錯誤之一是內(nèi)存泄漏险绘,即未能正確釋放以前分配的內(nèi)存的 bug。 只發(fā)生一次的小的內(nèi)存泄漏可能不會被注意誉碴,但泄漏大量內(nèi)存的程序或泄漏日益增多的程序可能會表現(xiàn)出各種征兆:從性能不良(并且逐漸降低)到內(nèi)存完全用盡宦棺。 更糟的是,泄漏的程序可能會用掉太多內(nèi)存黔帕,以致另一個程序失敗代咸,而使用戶無從查找問題的真正根源。 此外成黄,即使無害的內(nèi)存泄漏也可能是其他問題的征兆呐芥。
內(nèi)存泄漏會因為減少可用內(nèi)存的數(shù)量從而降低計算機的性能。最終奋岁,在最糟糕的情況下思瘟,過多的可用內(nèi)存被分配掉導(dǎo)致全部或部分設(shè)備停止正常工作,或者應(yīng)用程序崩潰闻伶。內(nèi)存泄漏可能不嚴重滨攻,甚至能夠被常規(guī)的手段檢測出來。在現(xiàn)代操作系統(tǒng)中,一個應(yīng)用程序使用的常規(guī)內(nèi)存在程序終止時被釋放铡买。這表示一個短暫運行的應(yīng)用程序中的內(nèi)存泄漏不會導(dǎo)致嚴重后果更鲁。