मुझे बताया गया है कि एक हैंडल एक पॉइंटर की तरह है, लेकिन ऐसा नहीं है, और यह आपको ऑब्जेक्ट के बजाय ऑब्जेक्ट का संदर्भ रखने की अनुमति देता है। अधिक विस्तृत व्याख्या क्या है?
मुझे बताया गया है कि एक हैंडल एक पॉइंटर की तरह है, लेकिन ऐसा नहीं है, और यह आपको ऑब्जेक्ट के बजाय ऑब्जेक्ट का संदर्भ रखने की अनुमति देता है। अधिक विस्तृत व्याख्या क्या है?
जवाबों:
कर्नेल स्थान में संसाधन के लिए सूचक से पूर्णांक इंडेक्स तक एक हैंडल कुछ भी हो सकता है। विचार यह है कि वे एक संसाधन का संक्षिप्त विवरण प्रदान करते हैं, इसलिए आपको इसका उपयोग करने के लिए संसाधन के बारे में बहुत कुछ जानने की आवश्यकता नहीं है।
उदाहरण के लिए, Win32 API में HWND एक विंडो के लिए एक हैंडल है। अपने आप से यह बेकार है: आप इससे किसी भी जानकारी को चमका नहीं सकते। लेकिन इसे सही एपीआई फ़ंक्शंस में पास करें, और आप इसके साथ अलग-अलग ट्रिक्स का खजाना प्रदर्शन कर सकते हैं। आंतरिक रूप से आप एचयूएनडी को केवल जीयूआई की तालिका में एक सूचकांक के रूप में सोच सकते हैं (जो जरूरी नहीं कि इसे कैसे लागू किया जाए, लेकिन यह जादू को समझ में आता है)।
संपादित करें: 100% निश्चित नहीं है कि विशेष रूप से आप अपने प्रश्न में क्या पूछ रहे थे। यह मुख्य रूप से शुद्ध सी / सी ++ के बारे में बात कर रहा है।
एक हैंडल एक पॉइंटर या इंडेक्स है जिसमें कोई भी दृश्य प्रकार संलग्न नहीं है। आमतौर पर आप कुछ इस तरह देखते हैं:
typedef void* HANDLE;
HANDLE myHandleToSomething = CreateSomething();
तो आपके कोड में आप सिर्फ एक अपारदर्शी मान के रूप में लगभग पास करते हैं।
ऑब्जेक्ट का उपयोग करने वाले कोड में, यह पॉइंटर को एक वास्तविक संरचना प्रकार में डालता है और इसका उपयोग करता है:
int doSomething(HANDLE s, int a, int b) {
Something* something = reinterpret_cast<Something*>(s);
return something->doit(a, b);
}
या यह इसे एक सरणी / वेक्टर के सूचकांक के रूप में उपयोग करता है:
int doSomething(HANDLE s, int a, int b) {
int index = (int)s;
try {
Something& something = vecSomething[index];
return something.doit(a, b);
} catch (boundscheck& e) {
throw SomethingException(INVALID_HANDLE);
}
}
एक संभाल है सूचक का एक प्रकार है कि यह आम तौर पर कुछ इकाई को संदर्भित करने का एक तरीका है।
यह कहना अधिक सटीक होगा कि एक सूचक एक प्रकार का हैंडल है, लेकिन सभी हैंडल पॉइंटर्स नहीं हैं।
उदाहरण के लिए, एक हैंडल मेमोरी टेबल में कुछ इंडेक्स भी हो सकता है, जो एक प्रविष्टि से मेल खाती है जिसमें स्वयं किसी वस्तु का सूचक होता है।
महत्वपूर्ण बात यह है कि जब आपके पास "हैंडल" होता है, तो आप न तो जानते हैं और न ही परवाह करते हैं कि हैंडल वास्तव में उस चीज की पहचान कैसे करता है जिसे वह पहचानता है, आपको यह जानने की आवश्यकता है कि यह क्या करता है।
यह भी स्पष्ट होना चाहिए कि "वास्तव में एक हैंडल क्या है" का कोई एकल उत्तर नहीं है, क्योंकि विभिन्न चीजों को संभालता है, यहां तक कि एक ही सिस्टम में, "हुड के नीचे" अलग-अलग तरीकों से लागू किया जा सकता है। लेकिन आपको उन मतभेदों से चिंतित होने की आवश्यकता नहीं है।
सी ++ / सीएलआई में, एक हैंडल जीसी हीप पर स्थित ऑब्जेक्ट के लिए एक संकेतक है। (अप्रबंधित) C ++ हीप पर एक ऑब्जेक्ट का उपयोग करके प्राप्त किया जाता है new
और एक new
अभिव्यक्ति का परिणाम एक "सामान्य" पॉइंटर है। एक प्रबंधित ऑब्जेक्ट GC (प्रबंधित) हीप पर एक gcnew
अभिव्यक्ति के साथ आवंटित किया गया है । परिणाम एक संभाल होगा। आप हैंडल पर सूचक अंकगणित नहीं कर सकते। आप नि: शुल्क हैंडल नहीं करते हैं। जीसी उनकी देखभाल करेगी। इसके अलावा, GC प्रबंधित हीप पर ऑब्जेक्ट्स को स्थानांतरित करने और प्रोग्राम चलाने के दौरान नए स्थानों को इंगित करने के लिए हैंडल को अपडेट करने के लिए स्वतंत्र है।
यह हैंडल-बॉडी-आइडियल के संदर्भ में दिखाई देता है , जिसे पिम्पल मुहावरा भी कहा जाता है। यह एक पुस्तकालय के ABI (बाइनरी इंटरफ़ेस) को रखने की अनुमति देता है, वास्तविक डेटा को किसी अन्य कक्षा ऑब्जेक्ट में रखता है, जिसे केवल "हैंडल" ऑब्जेक्ट में रखे गए एक पॉइंटर द्वारा संदर्भित किया जाता है, जिसमें उस क्लास को सौंपने वाले फ़ंक्शन शामिल हैं। तन"।
यह दो वस्तुओं की निरंतर समय और अपवाद सुरक्षित स्वैप को सक्षम करने के लिए भी उपयोगी है। इसके लिए, बॉडी ऑब्जेक्ट को इंगित करने वाले पॉइंटर को केवल स्वैप करना होगा।
एक हैंडल वह है जो आप चाहते हैं कि वह हो।
एक हैंडल कुछ लुकअप तालिका में उपयोग किए गए अहस्ताक्षरित पूर्णांक हो सकता है।
एक हैंडल एक संकेतक हो सकता है, या में, डेटा का एक बड़ा सेट।
यह निर्भर करता है कि हैंडल का उपयोग करने वाला कोड कैसे व्यवहार करता है। जो हैंडल प्रकार को निर्धारित करता है।
' हैंडल ' शब्द का उपयोग किस कारण से किया जाता है, यह महत्वपूर्ण है। जो उन्हें किसी वस्तु की पहचान या पहुंच प्रकार के रूप में इंगित करता है। मतलब, प्रोग्रामर के लिए, वे एक 'कुंजी' या किसी चीज तक पहुंच का प्रतिनिधित्व करते हैं।
HANDLE hnd;
के समान है void * ptr;
HANDLE विजुअल स्टूडियो (Windows) में winnt.h फ़ाइल में परिभाषित एक टाइपफ़ीड है:
typedef void *HANDLE;
HANDLE के बारे में और पढ़ें