C 之小白看記憶體申請與釋放

2021-09-24 09:10:53 字數 2000 閱讀 7695

c++ 的記憶體分配方式和c有區別,c採用的是mallocrealloccalloc等方式,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...