使用智能指針進行實例化和解除分配

10 月 10

Raima徽標在灰色的背景上

如前一篇文章TBD:LINK所述,我們了解到特定數據庫架構的C ++接口是由架構編譯器生成的。這些接口由許多帶有公共方法的類組成。一些方法對於一個以上的類(包含在基類中)是通用的,而其他方法是特定於特定類的(包含在由模式編譯器生成的專用類中)。

智能指針

定義接口的類(API類)在基類中聲明了一個且只有一個成員變量,即受保護的指針。因此,兩個基類中的每一個都有一個指針,並且在這些類中的任何一個中都沒有其他成員變量。這些指針後面的對象包含API實現的主要部分。這些對象將在以後引用實現類對象。

指向實現類對象的指針被實現為智能指針(http://en.wikipedia.org/wiki/Smart_pointer),該實現對應用程序開發人員是隱藏的。引用計數器在實現類中聲明,並且API類對默認構造函數,複製構造函數,賦值運算符和析構函數使用顯式的公共方法來實現此目的。

實例化實現對象時,參考計數器將初始化為1。實例化始終是所調用的任何API類中方法的結果。對於Db接口,它始終是任何Open函數(在Db接口中聲明為靜態方法),而對於Cursor接口,Db和Cursor接口中都包含多種方法。

每當有一個附加對象引用參考計數器時,該計數器就會遞增;而當有一個較少對象引用它時,該計數器將遞減。對於任何Cursor接口,我們只考慮從API對像到實現對象的指針,而對於Db接口,則不考慮來自實現對象的指針。當引用計數降至零時,將釋放實現對象。這種設計確保了只要可以從API對象直接或間接引用實現對象,就將保留實現對象,否則將對其進行釋放。

然後,應用程序開發人員創建API類的靜態對象實例,並按值傳遞它們,如下所示:

Cursor_sensor newRecord(Db_myDatabase dbPar){
Cursor_myRecord游標= dbPar.New_myRecord_record();
cursor.Set_name(“ Tim”);

}

int main(intargc,char * argv []){

Db_myDatabase db = Db_myDatabase :: Open();
db.Initialize();
Cursor_myRecord cursorNew = newRecord(db);

}

如上例所示,每次傳遞API類對象時都會實例化它們。在上面的例子中。 “ Db_myDatabase :: Open()”實例化一個引用計數為1的Db_myDatabase對象。該對象與復制構造函數一起使用,以在主函數中初始化db,將引用計數增加為2。然後銷毀實例化的第一個對象,這會將引用計數恢復為一個。

“ newRecord(db)”實例化形式參數dbPar的另一個Db_myDatabase對象,該對象將引用計數增加到兩個。該函數實例化一個引用計數為1的Cursor_myRecord對象。此實例化還將Db_myDatabase對象的實現對象的引用計數增加到3。

Cursor_myRecord對象與復制構造函數一起使用,以與在主函數中初始化db相同的方式來初始化游標。然後銷毀實例化的第一個Cursor_myRecord對象,這會將引用計數遞減為1。當游標被銷毀時,對於從函數返回的對象又發生了另一個實例化。

返回函數並將Cursor_myRecord對象分配給cursorNew之後,Cursor_myRecord對象的引用計數為1,而Db_myDatabase對象的引用計數為2。

當主函數返回db和cursorNew時,將銷毀引用計數減為零,並且兩個實現對像也將銷毀。

在下一個TBD:LINK中,我們簡要介紹了API。

Get notified about new RDM updates

Be the first to know about new Raima Database Manager updates when they go live, use cases, industry trends and more.