2011-01-08 38 views
8

如何使用std.typecons.RefCounted!(T),以使d引用計數的對象?製作使用引用計數在d引用計數的對象!(T)

我試圖找出什麼std.array.Array在內部通過查看源代碼,但雖然我可以讀取源,但我不能確定什麼是「有效載荷」或它是如何工作的涉及的按位結構複製,以及爲什麼有些東西在內部和外部結構中是重複的。

誰能提供一個例子或如何使用它,比方說,包裝一個簡單的Win32 HANDLE鏈接?

謝謝!

回答

9

免責聲明:我沒有測試過我的權利,只是讀了documentation

有效載荷指的是正在存儲的內容。在你的情況下,有效載荷是Win32 HANDLE。由於HANDLE只是一個整數,你不會想要做的:

auto refHandle = RefCounted!HANDLE(WhatGetsMeAHandle()); 

因爲Windows功能將需要在手柄超出範圍被調用。

在std.containers.Array你看到一個叫做有效載荷結構,其中有一個叫_payload場。該結構將成爲通過_payload訪問的數據存儲。這提供了一個間接的級別以備後用。

你會發現,引用計數實際上是used on the Array structure。這意味着只有在引用計數爲0時纔會調用該結構的析構函數。因此,Payload中的〜this()是您希望清理HANDLE的地方。

發生了什麼事情:因爲struct是一個值類型,每次結構超出範圍時,調用析構函數,數組中沒有一個,但Payload包裝在RefCounted中,RefCounted!Payload的析構函數也被稱爲。只有當引用計數達到零時,纔會調用Payload本身的析構函數。

現在,引用計數本身具有引用語義,這意味着具有陣列一個,則可以分配給汽車B = A;並且所有內容都將被複制,但RefCounted具有postblits defined這意味着數據不會被複制,但引用計數將會增加 。

我現在會嘗試爲您提供一個包裝大綱。它可能會幫助你看到上面的信息,但它可能不完全正確。讓我知道是否需要修復。

struct MyWinWrapper { 
    struct Payload { 
     HANDLE _payload; 
     this(HANDLE h) { _payload = h; } 
     ~this() { freeHandleHere(_payload); } 

     // Should never perform these operations 
     this(this) { assert(false); } 
     void opAssign(MyWinWrapper.Payload rhs) { assert(false); } 
    } 

    private alias RefCounted!(Payload, RefCountedAutoInitialize.no) Data; 
    private Data _data; 

    this(HANDLE h) { _data = Data(h); } 
} 

由於沒有結構的默認構造函數,您可能想要提供一個返回此結構的免費函數。

+0

謝謝您的詳細解答!你讓它看起來很簡單! :) – Mehrdad 2011-01-08 21:20:50