Yasal Uyarı: Hak talebimi test etmedim, sadece documentation'u okuyun.
Yük, neyin depolandığını ifade etmektedir. Senin durumunda yükü Win32 HANDLE. KULP sadece bir tamsayı olduğu için tek yapmanız istemem: kolu kapsam dışına çıktığında
auto refHandle = RefCounted!HANDLE(WhatGetsMeAHandle());
Windows işlevi gerekir Çünkü
çağrılacak.
std.containers.Array öğesinde gördükleriniz, _payload adlı bir alana sahip olan Payload adlı bir yapıydı. Yapı, _payload aracılığıyla erişilen verinin depolanması olacak. Bu, daha sonra kullanılmak üzere bir dolaylılık seviyesi sağlar.
RefCounted'ın aslında used on the Array structure olduğunu fark edeceksiniz. Bu, bu yapının yıkıcısı sadece referans sayısı 0 olduğunda çağrılacağı anlamına gelir. Bu nedenle, Yük yükünün içindeki ~ bu(), KOLU'nuzu temizlemek istediğiniz yerdir.
Neler oluyor: struct bir değer türü olduğu için, yapının kapsam dışına çıktığı her seferinde yıkıcı adı verilir, Array için bir tane yoktur, ancak Yükleme RefCounted için bir destektir; böyle de adlandırılır. Ve sadece referans sayısı sıfıra ulaştığında, kendisini yükleyen kendisi için yıkıcıdır.
Şimdi, RefCounted'in kendisi bir referans semantiğine sahiptir, bu bir Array a'ya sahip olmanızın ardından otomatik b = a'ya atayabileceğiniz anlamına gelir; ve her şey kopyalanacaktır, ancak RefCounted'in postblits defined'a sahip olduğu anlamına gelir, yani veriler kopyalanmayacaktır, ancak referans sayısı artırılacaktır.
Şimdi ne istediğiniz için size bir sarıcı taslağı sunmaya çalışacağım. Yukarıdaki bilgileri görselleştirmenize yardımcı olabilir, ancak tamamen doğru olmayabilir. Bir şeyin düzeltilmesi gerekiyorsa bana bildirin.
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); }
}
Yapı için varsayılan kurucu olmadığından, muhtemelen bu yapıyı döndüren ücretsiz bir işlev sağlamak isteyeceksiniz.
Detaylı cevap için teşekkür ederiz! Çok kolay görünüyorsun! :) – Mehrdad
@Lambert, başlangıçta istediğim şeyi yapamayacağımı bilmediğim ilk kod snippet'ini kullanmamayı söyleyeceğim. Ama sonra ilgilendim ve öğrendiklerimi yazmaya başladım. –
myWinWrapper için ctor yapmamalısınız '_data = Data (h);'? –