?
本文檔使用
php中文網(wǎng)手冊 發(fā)布
可以用一個(gè)C++模式的編譯器來編譯PostgreSQL的擴(kuò)展性,如下:
后臺連接的所有函數(shù)必須為后臺提供一個(gè)C接口; 這樣,C函數(shù)可以調(diào)用C++函數(shù)。例如,后臺連接函數(shù)請求一個(gè)extern C連接。 對此,那些在后臺和C++代碼之間傳遞為指針的函數(shù)也是需要的。
使用合適的重分配方法來釋放內(nèi)存。例如,
大多數(shù)的后臺內(nèi)存是用palloc()
分配的,因此使用pfree()
來釋放,在這種情況下,
使用C++的delete()
會失敗。
避免傳遞到C代碼的異常(在extern C函數(shù)的最高級別使用一個(gè)抓取所有塊)。
這是必須的,即使C++代碼不會拋出一場,因?yàn)轭愃朴趦?nèi)存溢出仍會拋出異常。
任何的異常都必須被抓取,并且向C接口返回相關(guān)的錯(cuò)誤。
如果可能的話,帶有-fno-exceptions的C++編譯器排除所有的異常;
在這種情況下,必須檢查C++代碼中的所有錯(cuò)誤,檢查new()
返回的空。
如果從C++代碼調(diào)用后臺函數(shù),要確保C++調(diào)用堆棧只包含普通的舊數(shù)據(jù)結(jié)構(gòu)(POD)。
這是必須的,因?yàn)楹笈_錯(cuò)誤產(chǎn)生一個(gè)模糊的longjmp()
(它不能恰當(dāng)?shù)挠?acronym class="ACRONYM">POD對象
來展開一個(gè)C++請求)。
總之,最好在與后臺進(jìn)程接口的extern C的后面放置C++代碼, 并且避免異常,內(nèi)存和調(diào)用堆棧泄漏。