C ++ में एक हैंडल क्या है?


98

मुझे बताया गया है कि एक हैंडल एक पॉइंटर की तरह है, लेकिन ऐसा नहीं है, और यह आपको ऑब्जेक्ट के बजाय ऑब्जेक्ट का संदर्भ रखने की अनुमति देता है। अधिक विस्तृत व्याख्या क्या है?



2
जिम्मेदारी पैटर्न की श्रृंखला में देखें, आप सीखेंगे कि एक "हैंडल" मूल रूप से एक नोड है, और यह कि "हैंडलर" उनमें से एक छोटा सा सेट है। "जादू" पुनरावर्तन से आता है

जवाबों:


100

कर्नेल स्थान में संसाधन के लिए सूचक से पूर्णांक इंडेक्स तक एक हैंडल कुछ भी हो सकता है। विचार यह है कि वे एक संसाधन का संक्षिप्त विवरण प्रदान करते हैं, इसलिए आपको इसका उपयोग करने के लिए संसाधन के बारे में बहुत कुछ जानने की आवश्यकता नहीं है।

उदाहरण के लिए, Win32 API में HWND एक विंडो के लिए एक हैंडल है। अपने आप से यह बेकार है: आप इससे किसी भी जानकारी को चमका नहीं सकते। लेकिन इसे सही एपीआई फ़ंक्शंस में पास करें, और आप इसके साथ अलग-अलग ट्रिक्स का खजाना प्रदर्शन कर सकते हैं। आंतरिक रूप से आप एचयूएनडी को केवल जीयूआई की तालिका में एक सूचकांक के रूप में सोच सकते हैं (जो जरूरी नहीं कि इसे कैसे लागू किया जाए, लेकिन यह जादू को समझ में आता है)।

संपादित करें: 100% निश्चित नहीं है कि विशेष रूप से आप अपने प्रश्न में क्या पूछ रहे थे। यह मुख्य रूप से शुद्ध सी / सी ++ के बारे में बात कर रहा है।


14
एक हैंडल राज्यों को बचाने के लिए (दूसरों के बीच) उपयोगी हो सकता है। यदि u में std :: वेक्टर जैसी संरचना में डेटा है। आपकी ऑब्जेक्ट किसी प्रोग्राम के निष्पादन के दौरान अलग-अलग समय पर अलग-अलग मेमोरी स्थानों पर हो सकती है, जिसका अर्थ है कि उस मेमोरी के लिए आपका पॉइंटर मूल्यों को बदल देगा। एक हैंडल के साथ यह कभी नहीं बदलता है, यह हमेशा आपकी वस्तु का संदर्भ देता है। एक कार्यक्रम की स्थिति को बचाने की कल्पना करें (जैसे एक गेम में) - आप डेटा के लिए एक पॉइंटर स्थान को नहीं बचाएंगे और बाद में डेटा को फिर से आयात करेंगे और उस पते को मेमोरी में प्राप्त करने का प्रयास करेंगे। हालाँकि आप अपने डेटा के साथ एक हैंडल बचा सकते हैं, और डेटा और हैंडल को आयात कर सकते हैं।
सिंसिस्टररैनो

क्या लिनक्स में एक हाथ को एक समकक्ष में बदलना संभव है? मुझे एक प्रोग्राम को माइग्रेट करना होगा जो विंडोज से लिनक्स तक हैंडल का उपयोग करता है।
कॉर्नेल वेरस्टर

1
यह सही उत्तर है, कि वे कुछ भी हो सकते हैं, और यह कि उनका उपयोग करने वाला कोड हैंडल के प्रकार को परिभाषित करता है। मैंने अपने स्वयं के समान उत्तर का एक अधिक संक्षिप्त संस्करण बनाने की कोशिश की, खुद की मदद नहीं कर सका, पोस्टर के लिए। @CornelVerster - वे लिनक्स में समान हैं। मेरा मतलब है, ओएस हैंडल नहीं, लेकिन अवधारणा। तो, यह अपने प्रवास के रूप में संभाल पर निर्भर करता है, या यहां तक ​​कि प्रवास करने की आवश्यकता है।
dyasta

@ मैथ्यू इसेलिन: किसी भी एपीआई दस्तावेज में, क्या वे परिभाषित करते हैं कि वह चीज एक हैंडलर है तो हमें उन्हें फंक्शंस में पास करना चाहिए, अन्यथा हम कैसे जान सकते हैं कि एपीआई दस्तावेज में एक हैंडलर क्या है
अमीन खोरमाई

51

एक हैंडल एक पॉइंटर या इंडेक्स है जिसमें कोई भी दृश्य प्रकार संलग्न नहीं है। आमतौर पर आप कुछ इस तरह देखते हैं:

 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);
     }
 }

29

एक संभाल है सूचक का एक प्रकार है कि यह आम तौर पर कुछ इकाई को संदर्भित करने का एक तरीका है।

यह कहना अधिक सटीक होगा कि एक सूचक एक प्रकार का हैंडल है, लेकिन सभी हैंडल पॉइंटर्स नहीं हैं।

उदाहरण के लिए, एक हैंडल मेमोरी टेबल में कुछ इंडेक्स भी हो सकता है, जो एक प्रविष्टि से मेल खाती है जिसमें स्वयं किसी वस्तु का सूचक होता है।

महत्वपूर्ण बात यह है कि जब आपके पास "हैंडल" होता है, तो आप न तो जानते हैं और न ही परवाह करते हैं कि हैंडल वास्तव में उस चीज की पहचान कैसे करता है जिसे वह पहचानता है, आपको यह जानने की आवश्यकता है कि यह क्या करता है।

यह भी स्पष्ट होना चाहिए कि "वास्तव में एक हैंडल क्या है" का कोई एकल उत्तर नहीं है, क्योंकि विभिन्न चीजों को संभालता है, यहां तक ​​कि एक ही सिस्टम में, "हुड के नीचे" अलग-अलग तरीकों से लागू किया जा सकता है। लेकिन आपको उन मतभेदों से चिंतित होने की आवश्यकता नहीं है।


6

सी ++ / सीएलआई में, एक हैंडल जीसी हीप पर स्थित ऑब्जेक्ट के लिए एक संकेतक है। (अप्रबंधित) C ++ हीप पर एक ऑब्जेक्ट का उपयोग करके प्राप्त किया जाता है newऔर एक newअभिव्यक्ति का परिणाम एक "सामान्य" पॉइंटर है। एक प्रबंधित ऑब्जेक्ट GC (प्रबंधित) हीप पर एक gcnewअभिव्यक्ति के साथ आवंटित किया गया है । परिणाम एक संभाल होगा। आप हैंडल पर सूचक अंकगणित नहीं कर सकते। आप नि: शुल्क हैंडल नहीं करते हैं। जीसी उनकी देखभाल करेगी। इसके अलावा, GC प्रबंधित हीप पर ऑब्जेक्ट्स को स्थानांतरित करने और प्रोग्राम चलाने के दौरान नए स्थानों को इंगित करने के लिए हैंडल को अपडेट करने के लिए स्वतंत्र है।


5

यह हैंडल-बॉडी-आइडियल के संदर्भ में दिखाई देता है , जिसे पिम्पल मुहावरा भी कहा जाता है। यह एक पुस्तकालय के ABI (बाइनरी इंटरफ़ेस) को रखने की अनुमति देता है, वास्तविक डेटा को किसी अन्य कक्षा ऑब्जेक्ट में रखता है, जिसे केवल "हैंडल" ऑब्जेक्ट में रखे गए एक पॉइंटर द्वारा संदर्भित किया जाता है, जिसमें उस क्लास को सौंपने वाले फ़ंक्शन शामिल हैं। तन"।

यह दो वस्तुओं की निरंतर समय और अपवाद सुरक्षित स्वैप को सक्षम करने के लिए भी उपयोगी है। इसके लिए, बॉडी ऑब्जेक्ट को इंगित करने वाले पॉइंटर को केवल स्वैप करना होगा।


2

एक हैंडल वह है जो आप चाहते हैं कि वह हो।

एक हैंडल कुछ लुकअप तालिका में उपयोग किए गए अहस्ताक्षरित पूर्णांक हो सकता है।

एक हैंडल एक संकेतक हो सकता है, या में, डेटा का एक बड़ा सेट।

यह निर्भर करता है कि हैंडल का उपयोग करने वाला कोड कैसे व्यवहार करता है। जो हैंडल प्रकार को निर्धारित करता है।

' हैंडल ' शब्द का उपयोग किस कारण से किया जाता है, यह महत्वपूर्ण है। जो उन्हें किसी वस्तु की पहचान या पहुंच प्रकार के रूप में इंगित करता है। मतलब, प्रोग्रामर के लिए, वे एक 'कुंजी' या किसी चीज तक पहुंच का प्रतिनिधित्व करते हैं।


2

HANDLE hnd; के समान है void * ptr;

HANDLE विजुअल स्टूडियो (Windows) में winnt.h फ़ाइल में परिभाषित एक टाइपफ़ीड है:

typedef void *HANDLE;

HANDLE के बारे में और पढ़ें


1
यह केवल विंडोज पर लागू होता है, और विंडोज आर्किटेक्चर के माध्यम से उपयोग किए जाने वाले कई प्रकार के हैंडल में से केवल एक है। हालाँकि, यह वही है जो एक 'सामान्य विंडोज़ अनुप्रयोग-स्तरीय हैंडल' के रूप में जाना जाएगा।
dyasta
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.