Python C API 引用計數器(三)

來源:互聯網
上載者:User

標籤:dem   初始化   迴圈   define   printf   應用   include   str   垃圾   

簡介

Python的記憶體管理是通過對象的引用計數器來實現的,對象的建立會將引用計數器加1,被引用一次則引用計數器就會加1,反之解除引用時,則引用計數器就會減1,當Python對象的引用計數器為0的時候,則這個對象就會被回收和釋放。

這種記憶體管理的方式是有一定的弊端的,一是它需要額外的空間維護引用計數,二是它不能解決對象的“循環參考”的問題,因此,也有很多語言比如Java並沒有採用該演算法做來垃圾的回收機制。

Python代碼執行個體

import sysdef test_refcount(a):    print("func a refcount: {}".format(sys.getrefcount(a)))if __name__ == ‘__main__‘:    // 直接建立Python對象    a = 189987319    print("a refcount: {}".format(sys.getrefcount(a)))    // 調用一次Python對象a,則引用計數器加1    b = a    print("b, a refcount: {}".format(sys.getrefcount(a)))    // 存入列表,欄位,或者元組中,引用計數器都會加1    c = [a]    print("c, a refcount: {}".format(sys.getrefcount(a)))    // 使用函數調用的時候,傳參的時候引用計數器加1,調用的時候引用計數器也會加1,因此是加2    test_refcount(a)結果:a refcount: 1b, a refcount: 2c, a refcount: 3func a refcount: 5
Python C API中管理及釋放Python對象

void Py_INCREF(PyObject *o) Python對象引用計數器加1,該對象不能為NULL,否則會報錯

void Py_XINCREF(PyObject *o) Python對象引用計數器加1,該對象可以為NULL,但是引用計數器未生效

void Py_DECREF(PyObject *o) Python對象的引用計數器減1,該對象不能為NULL,否則會報錯

void Py_XDECREF(PyObject *o) Python對象引用計數器減1,該對象可以為NULL,但是引用計數器未生效

void Py_CLEAR(PyObject *o) 直接將Python應用計數器清0

C代碼執行個體

標頭檔

//// Created by lanyulei on 18-9-9.//#ifndef PRINT_DEMO1_PYREFCOUNT_H#define PRINT_DEMO1_PYREFCOUNT_H#include <stdio.h>#include <stdlib.h>#include <string.h>#include <Python.h>void pyRefCount();#endif //PRINT_DEMO1_PYREFCOUNT_H

源檔案

//// Created by lanyulei on 18-9-9.//#include "pyRefCount.h"// Python對象的保留及釋放void pyRefCount(){    PyObject* py_ival = Py_BuildValue("i", 56486);  // 建立對象    printf("Py_BuildValue: py_ival refcount: %ld\n", Py_REFCNT(py_ival));   // 列印Python對象的引用計數器    Py_XINCREF(py_ival);   // Python對象的引用計數器加1    printf("Py_BuildValue: py_ival refcount: %ld\n", Py_REFCNT(py_ival));   // 列印Python對象的引用計數器    Py_XDECREF(py_ival);    // Python對象的引用計數器減1    printf("Py_BuildValue: py_ival refcount: %ld\n", Py_REFCNT(py_ival));   // 列印Python對象的引用計數器    Py_CLEAR(py_ival);   // Python對象的引用計數器清0    printf("Py_BuildValue: py_ival refcount: %ld\n", Py_REFCNT(py_ival));   // 列印Python對象的引用計數器}

main.cpp

#include "pyRefCount.h"int main() {    // 初始化Python虛擬機器    Py_Initialize();    // 判斷Python虛擬機器是否成功    if (Py_IsInitialized() == 0){        printf("fal to initialize Python\n");        return -1;    }    printf("server start\n");    pyRefCount();    // 退出Python虛擬機器    Py_Finalize();    return 0;}

Python C API 引用計數器(三)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.