第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Python CApi參考計(jì)數(shù)詳細(xì)信息

Python CApi參考計(jì)數(shù)詳細(xì)信息

慕容3067478 2021-04-08 10:15:14
我在這里查看一些示例代碼(https://docs.python.org/2.0/api/refcountDetails.html),并試圖更好地理解兩個(gè)示例之間的區(qū)別:第一個(gè)示例是:PyObject *t;t = PyTuple_New(3);PyTuple_SetItem(t, 0, PyInt_FromLong(1L));PyTuple_SetItem(t, 1, PyInt_FromLong(2L));PyTuple_SetItem(t, 2, PyString_FromString("three"));作者解釋說(shuō)PyTuple_SetItem()會(huì)竊取該引用(因此無(wú)需對(duì)其進(jìn)行DECREF)。 很好,我明白了。然后,作者使用PySequence_SetItem()呈現(xiàn)了類(lèi)似的代碼,該代碼不會(huì)竊取引用,因此調(diào)用者必須使用DECREF,示例代碼如下所示:PyObject *l, *x;l = PyList_New(3);x = PyInt_FromLong(1L);PySequence_SetItem(l, 0, x); Py_DECREF(x);x = PyInt_FromLong(2L);PySequence_SetItem(l, 1, x); Py_DECREF(x);x = PyString_FromString("three");PySequence_SetItem(l, 2, x); Py_DECREF(x);PyObject *l, *x;我的問(wèn)題是,如果第二個(gè)示例與傳遞PyTYPE_FromSOMETYPE的第一個(gè)示例類(lèi)似,將會(huì)發(fā)生什么情況?PyObject *l;l = PyList_New(3);PySequence_SetItem(l, 0, PyInt_FromLong(1L));PySequence_SetItem(l, 1, PyInt_FromLong(2L));PySequence_SetItem(l, 2, PyString_FromString("three"));最后一種情況是良性的,還是會(huì)導(dǎo)致內(nèi)存泄漏(因?yàn)镻ySequence_SetItem不會(huì)獲得PyInt_FromLong和PyString_FromString創(chuàng)建的引用的所有權(quán),并且調(diào)用方也不會(huì)對(duì)其進(jìn)行DECREF)?
查看完整描述

1 回答

?
慕的地6264312

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊

這會(huì)導(dǎo)致內(nèi)存泄漏。

創(chuàng)建對(duì)象時(shí),它的引用計(jì)數(shù)為1。對(duì)象只有在引用計(jì)數(shù)變?yōu)?時(shí)才會(huì)被刪除。

第一個(gè)示例:將新對(duì)象傳遞給竊取引用(獲得所有權(quán))的函數(shù)(如)時(shí),PyTuple_SetItemrefcount不會(huì)增加,因此仍為1。當(dāng)元組最終被銷(xiāo)毀并對(duì)其所有元素進(jìn)行refref時(shí),計(jì)數(shù)將降為0,因此將其銷(xiāo)毀。一切都很好。

第三個(gè)示例:將新對(duì)象傳遞給不會(huì)竊取引用(創(chuàng)建新引用)的函數(shù)(如)時(shí),PySequence_SetItemrefcount會(huì)增加,因此為2。當(dāng)元組最終被銷(xiāo)毀并對(duì)其所有元素進(jìn)行refref時(shí), count將下降到1,因此不會(huì)被銷(xiāo)毀。而且,由于沒(méi)有其他人可以引用它了(除非您將其存儲(chǔ)在某個(gè)地方),所以任何人都無(wú)法對(duì)它進(jìn)行解引用。所以它泄漏了。

第二個(gè)示例:將新對(duì)象傳遞給不會(huì)竊取引用(創(chuàng)建新引用)的函數(shù)(如),PySequence_SetItem然后調(diào)用Py_DECREF它時(shí),refcount遞增為2,然后遞減為1。最終被銷(xiāo)毀并對(duì)其所有元素進(jìn)行refref,計(jì)數(shù)將降至0。一切都變好了。


如果您想知道為什么Python會(huì)同時(shí)具有任何非偷竊功能,那么您只需要考慮一個(gè)不那么瑣碎的情況即可。

如果您想將該項(xiàng)目放入兩個(gè)元組而不是一個(gè)中,該怎么辦?或者,如果您想將其放在一個(gè)元組中,但又將其存儲(chǔ)在C靜態(tài)指針中,某個(gè)模塊的全局變量中或其他地方?如果要將引用計(jì)數(shù)存儲(chǔ)在兩個(gè)位置,則希望將其增加2,而當(dāng)您的局部變量消失時(shí),引用計(jì)數(shù)將減少1。對(duì)于只是創(chuàng)建某些東西并立即將其移交的非常簡(jiǎn)單的情況,引用竊取函數(shù)使您可以避免單引號(hào)和一引號(hào)的使用,并且對(duì)單行代碼很好用和方便。但是對(duì)于任何更復(fù)雜的事情,這都是沒(méi)有意義的。


查看完整回答
反對(duì) 回復(fù) 2021-04-27
  • 1 回答
  • 0 關(guān)注
  • 210 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)