अस्वीकरण: मैंने अपने दावों का परीक्षण नहीं किया है, बस documentation पढ़ें।
पेलोड संग्रहीत किया जा रहा है इसका जिक्र कर रहा है। आपके मामले में पेलोड Win32 हैंडल है। के बाद से हैंडल सिर्फ एक पूर्णांक है आप नहीं करना चाहते हैं: जब संभाल दायरे से बाहर चला जाता है
auto refHandle = RefCounted!HANDLE(WhatGetsMeAHandle());
क्योंकि एक Windows समारोह की आवश्यकता होगी कहा जाता है।
std.containers.Array जो आपने देखा वह पेलोड नामक एक संरचना थी, जिसमें _payload नामक एक फ़ील्ड था। संरचना डेटा का भंडारण होने जा रही है, _payload के माध्यम से पहुंचा जा सकता है। यह बाद में उपयोग करने के लिए संकेत का एक स्तर प्रदान करता है।
आप देखेंगे कि RefCounted वास्तव में used on the Array structure है। इसका मतलब है कि उस संरचना के लिए विनाशक केवल तभी बुलाया जाएगा जब संदर्भ गणना 0 है। तो ~ यह() पेलोड के अंदर है जहां आप अपना हैंडल साफ़ करना चाहते हैं।
क्या हो रहा है: चूंकि संरचना एक मूल्य प्रकार है, क्योंकि जब भी संरचना ढेर से बाहर हो जाती है तो विनाशक को बुलाया जाता है, वहां ऐरे के लिए कोई नहीं होता है, लेकिन पेलोड को रेफकाउंट में लपेटा जाता है, रेफकाउंट के लिए विनाशक! पेलोड भी कहा जाता है और केवल जब संदर्भ गणना शून्य तक पहुंच जाती है तो पेलोड के लिए विनाशक स्वयं को बुलाता है।
अब, RefCounted में संदर्भ अर्थशास्त्र है, इसका मतलब है कि एक ऐरे होने के बाद, आप ऑटो 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); }
}
चूंकि संरचना के लिए कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है, इसलिए आप शायद एक नि: शुल्क फ़ंक्शन प्रदान करना चाहते हैं जो इस संरचना को लौटाता है।
विस्तृत उत्तर के लिए धन्यवाद! आपने इसे इतना आसान बना दिया! :) – Mehrdad
@ लैम्बर्ट, मूल रूप से मैं पहले कोड स्निपेट का उपयोग न करने के साथ चिपकने वाला था क्योंकि मुझे नहीं पता था कि आप क्या चाहते थे। लेकिन फिर मुझे दिलचस्पी मिली और मैंने जो कुछ सीख रहा था उसे लिखना शुरू कर दिया। –
myWinWrapper के लिए ctor नहीं होना चाहिए '_data = डेटा (एच);'? –