python記憶體管理錯誤的 Python記憶體管理

2021-10-18 14:48:10 字數 1744 閱讀 6884

python採用block、pool、arenas三種結構來管理記憶體申請。

入口://申請nbytes的記憶體:

#undef pyobject_malloc

void *

pyobject_malloc(size_t nbytes)

block *bp;

poolp pool;

poolp next;

uint size;

#ifdef with_valgrind

if (unlikely(running_on_valgrind == -1))

running_on_valgrind = running_on_valgrind;

if (unlikely(running_on_valgrind))

goto redirect;

#endif

* limit ourselves to py_ssize_t_max bytes to prevent security holes.

* most python internals blindly use a signed py_ssize_t to track

* things without checking for overflows or negatives.

* as size_t is unsigned, checking for nbytes < 0 is not required.

if (nbytes > py_ssize_t_max)

return null;

* this implicitly redirects malloc(0).

if ((nbytes - 1) < small_request_threshold) ref; /* number of allocated blocks */

block *freeblock; /* pool's free list head */

struct pool_header *nextpool; /* next pool of this size class */

struct pool_header *prevpool; /* previous pool "" */

uint arenaindex; /* index into arenas of base adr */

uint szidx; /* block size class index */

uint nextoffset; /* bytes to virgin block */

uint maxnextoffset; /* largest valid nextoffset */

typedef struct pool_header *poolp;

維護著很多block記憶體塊。固定4k大小

3、usedpools

python內部維護的usedpools陣列是乙個非常巧妙的實現,維護著所有的處於used狀態的pool。當申請記憶體時,python就會通過usedpools尋找到一塊可用的(處於used狀態的)pool,從中分配乙個block。一定有乙個與usedpools相關聯的機制,完成從申請的記憶體的大小到size class index之間的轉換,否則python也就無法尋找到最合適的pool了。

4、arena,多個pool的集合。初始大小為16*256k=4m,當unused_arena_object為none擴充套件分配2倍增長。

/* record keeping for arenas. */

struct arena_object ;

常見的C記憶體管理錯誤

1 初始化錯誤。例如 malloc 返回的空間沒有進行初始化 2 未檢查返回值 3 對空指標或者無效指標解引用 4 引用已經釋放的記憶體 未定義 例如 for p head p null p p next free p 可以寫成 for p head p null p q 5 對同一塊記憶體釋放多次...

記憶體管理 常見記憶體錯誤及對策

發生記憶體錯誤是 件麻煩事,編譯器不能自動的發現這些錯誤,通常是在程式執行時才能捕捉到,而這些錯誤大多沒有明顯症狀,時隱時現增加了改錯的難度。1 記憶體被分配成功,卻使用了它。如果指標p是函式的引數,那麼在函式的入口處用 assert p null 進行檢查 如果用malloc或new來申請記憶體,...

Python的記憶體管理

最近在學deeplearning相關的內容,找到了deeplearning.net這個 上面的tutorial主要是介紹深度學習演算法,上面的實現是用python語言,用到的庫主要有numpy和theano。numpy大家比較熟悉了,不再細說 theano是乙個進行數學計算的庫,使用者可以更好的定義...