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