c++ 的記憶體分配方式和c有區別,c採用的是malloc
realloc
calloc
等方式,c++採用new和delete
首先要明白堆疊的概念
全域性區,靜態區:static
常量區: ""
堆:new,【需要自己主動釋放】
棧:區域性變數,【最大空間以系統為準,一般2m,超過會拋stack overflow的錯誤】
c++中宣告物件的方式有如下幾種
t t;
t t();
t* t= new t(); //new 會在堆開闢乙個空間
複製**
例項:
#include
class
t ~t()
t(const t& t)
t& operator= (const t &t)
void
countpp
() void
printdata
()private:
int count =0;
};void
fun(t * t)
intmain
(int argc, char *ar**)
複製**
輸出
建構函式0
我是列印1
執行完畢
執行第二種申請方式
建構函式0
我是列印1
執行完畢
析構函式1 【這個是指標的釋放,由我們呼叫delete觸發】
析構函式1 【方法退出,由系統自動呼叫析構】
複製**
由上面可以看出在呼叫完畢相應的方法之後,需要主動釋放。
所有的程式都是由簡到繁,所以注重釋放的時機很重要
原則上,誰申請誰消費的原則。
這裡再舉乙個例子,來說明你是否明白了堆疊的概念。【可能會有點繞】
class
ktmpcommsession
;ktmpcommsession::ktmpcommsession()
static
uint32_t session_id = 0;
uint32_t &ktmpcommsession::get_session_id()
template
class
ktmp:
public ktmpcommsession
public:
t* callback = nullptr;
intgetsessionid
()private:
void
autoincreatesessionid
() }
};複製**
首先定義了乙個模板類,細心的同學是不是發現為什麼要對乙個模板類進行繼承,原因:是因為我想我的所有模板都有乙個共有的屬性,而這個屬性每次在構造的時候都會被累加。每構造乙個不同的模板子類都會觸發這個屬性變化。故有了上面的寫法。為什麼不寫在同乙個類裡面,因為打包的時候可能會因為在不同的so中導致,有bug。
#include
typedef
std::function test;
void kinit::active(test fun)
//args 這個引數是async_request傳遞過來的引數,這個方法會被async_request呼叫,async_request的具體實現,這裡先不給出,
static
void _result_init(void *args)
}void * ***
(void * data)
intmain
(int argc, char *ar**)
複製**
注意上面標註的
如果沒有new的話,那麼在就會拋異常,原因就是因為是非同步導致被釋放了。
C 記憶體申請與釋放
c語言中申請記憶體malloc,釋放記憶體free。c 中申請記憶體new,釋放記憶體delete。include include 注意頭檔名稱 using namespace std intmain 執行結果 關於c語言的記憶體使用方式本文不再贅述。malloc與free不能觸發構造和析構函式,但...
c c記憶體申請與釋放
c 記憶體申請與釋放 new 表示式 string sp new string a value 分配並初始化乙個string物件 string arr new string 10 分配10個預設初始化的string對像 string arr new string 10 十個空的string stri...
學習 記憶體的申請與釋放
申請記憶體只有兩種方式 virtualalloc 在自己的記憶體中申請私有記憶體 includeint main virtualallocex 可以在別的程序中申請私有記憶體 addr pdword virtualallocex hprocess,申請指定程序的控制代碼 null,安全描述符 dll...