प्रौद्योगिकी साझेदारी

【C】स्मार्ट सूचक

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

स्मार्ट सूचकाः व्याख्यातवन्तः

Smart Pointer इति C++ इत्यस्मिन् एकं साधनं यस्य उपयोगः गतिशीलरूपेण आवंटितस्मृतेः स्वयमेव प्रबन्धनार्थं भवति ।

एषः एकः वर्गः अस्ति यः कच्चे सूचकानाम् कार्याणि समाहितं करोति तथा च संसाधनानाम् आवंटनं विमोचनं च स्वयमेव सम्भालितुं शक्नोति, तस्मात् प्रोग्रामर्-जनाः सामान्यस्मृति-प्रबन्धन-दोषान्, यथा स्मृति-लीक-, लम्बमान-सूचकानाम्, अन्य-समस्यानां च परिहाराय सहायकः भवति

स्मार्ट सूचकाः Resource Acquisition Is Initialization (RAII) तन्त्रस्य माध्यमेन कार्यं कुर्वन्ति, यस्य अर्थः अस्ति यत् स्मार्ट सूचकाः संसाधनानाम् अधिग्रहणं कुर्वन्ति यदा तेषां निर्माणं भवति तथा च संसाधनं नष्टं भवति तदा मुक्तं भवति एतेन असामान्यपरिस्थितौ अपि संसाधनानाम् सम्यक् मुक्तिः भवति ।

 

स्मार्ट सूचकैः समाधानं कृतानि समस्यानि

(1) मेमोरी लीक् : मेमोरी मैन्युअल् रूपेण मुक्तं भवति, परन्तु स्मार्ट पॉइंटर् इत्यस्य उपयोगेन स्वयमेव मुक्तं कर्तुं शक्यते ।

(2) साझास्वामित्वसूचकानाम् प्रसारणं विमोचनं च, यथा यदा बहुविधाः सूत्राः एकमेव वस्तु उपयुज्यन्ते तदा विनाशसमस्याः ।

 

स्मार्ट-सूचकानाम् अनेकाः प्रकाराः

C++ मानकपुस्तकालयः अनेकप्रकारस्य स्मार्टसूचकाः प्रदाति, यथा-

  1. std::unique_ptr

    • अनन्यस्वामित्वप्रतिरूप इत्यर्थः कunique_ptrदृष्टान्तस्य तस्य सूचकस्य वस्तुनः अनन्यस्वामित्वं भवति ।
    • कदाunique_ptrयदा व्याप्तेः बहिः गच्छति अथवा स्पष्टतया पुनः सेट् भवति तदा स्वयमेव विध्वंसकं आह्वयति, प्रबन्धितं वस्तु च मुक्तं करोति ।
    • प्रतिलिपिः समर्थिता नास्ति, परन्तु स्थानान्तरणं सम्भवति ।
  2. std::shared_ptr

    • साझास्वामित्वप्रतिरूपं, बहुविधं अनुमतिं ददातिshared_ptrउदाहरणानि एकस्यैव वस्तुनः स्वामित्वं साझां कुर्वन्ति ।
    • समानवस्तुनः सन्दर्भान् अनुसृत्य सन्दर्भगणनायाः उपयोगं कुर्वन्तुshared_ptrमात्रा।
    • यदा अन्तिमःshared_ptrयदा कश्चन दृष्टान्तः व्याप्तेः बहिः गच्छति अथवा पुनः सेट् भवति तदा सन्दर्भगणना शून्यं भवति, वस्तुनः विध्वंसकः आह्वयते, वस्तु च मुक्तः भवति ।
  3. std::weak_ptr

    • समाधानार्थं प्रयुक्तःshared_ptrपरिपत्र सन्दर्भ समस्या।
    • सन्दर्भगणनायाः वृद्धिं विना, तत् अवलोकयितुं शक्यतेshared_ptrप्रबन्धितवस्तूनि, परन्तु तस्य जीवनचक्रप्रबन्धने भागं न गृह्णाति ।
    • यदा नास्तिshared_ptrयदा दृष्टान्तः वस्तुं दर्शयति तदा ।weak_ptrवस्तु नष्टम् इति ज्ञातुं शक्नोति।

स्मार्ट पॉइंटर् इत्यस्य डिजाइनं उपयोगः च C++ इत्यस्मिन् स्मृतिप्रबन्धनं बहु सरलीकरोति तथा च कार्यक्रमस्य दृढतायां सुरक्षायां च सुधारं करोति । आधुनिक C++ प्रोग्रामिंग् इत्यस्मिन् कोडस्य गुणवत्तां, परिपालनक्षमतां च सुधारयितुम् कच्चा पॉइण्टर् इत्यस्य स्थाने स्मार्ट पॉइंटर् इत्यस्य उपयोगः अत्यन्तं अनुशंसितः अस्ति ।

 

स्मार्ट सूचक उदाहरणम्

स्मृति-लीक-आदि-संसाधन-प्रबन्धन-सम्बद्धानां विषयाणां निवारणाय गतिशीलरूपेण आवंटित-स्मृतेः स्वयमेव प्रबन्धनस्य साधनरूपेण C++-मध्ये स्मार्ट-सूचकानाम् उपयोगः भवति

std::unique_ptrउदाहरण

std::unique_ptrअनन्यस्वामित्वयुक्तः स्मार्ट-सूचकः अस्ति, यः केवलम् एकः एव अस्ति इति सुनिश्चितं करोतिstd::unique_ptr दृष्टान्तस्य दत्तसंसाधनस्य नियन्त्रणं भवति ।कदाstd::unique_ptrयदा व्याप्तेः बहिः गच्छति अथवा पुनः सेट् भवति तदा तस्य स्वामित्वं प्राप्ताः संसाधनाः स्वयमेव मुक्ताः भविष्यन्ति ।

  1. #include <memory>
  2. class MyClass {
  3. public:
  4. MyClass() { std::cout << "MyClass constructor called.n"; }
  5. ~MyClass() { std::cout << "MyClass destructor called.n"; }
  6. void doSomething() { std::cout << "Doing something...n"; }
  7. };
  8. int main() {
  9. // 创建一个unique_ptr来管理MyClass的实例
  10. std::unique_ptr<MyClass> uptr(new MyClass());
  11. // 调用doSomething方法
  12. uptr->doSomething();
  13. // unique_ptr会在离开作用域时自动调用MyClass的析构函数
  14. return 0;
  15. }

std::shared_ptrउदाहरण

std::shared_ptrएकः साझा-स्वामित्व-स्मार्ट-सूचकः अस्ति यः बहुविधं अनुमतिं ददातिstd::shared_ptrउदाहरणानि एकस्यैव संसाधनस्य स्वामित्वं साझां कुर्वन्ति ।std::shared_ptrसन्दर्भगणनायाः उपयोगं कुर्वन्तु यत् कति स्मार्टसूचकाः एकस्मिन् संसाधने सूचयन्ति यदा सन्दर्भगणना 0 भवति तदा संसाधनं मुक्तं भवति ।

  1. #include <memory>
  2. class MyClass {
  3. public:
  4. MyClass() { std::cout << "MyClass constructor called.n"; }
  5. ~MyClass() { std::cout << "MyClass destructor called.n"; }
  6. void doSomething() { std::cout << "Doing something...n"; }
  7. };
  8. int main() {
  9. // 创建一个shared_ptr来管理MyClass的实例
  10. std::shared_ptr<MyClass> sptr(new MyClass());
  11. // 创建第二个shared_ptr,共享同一个MyClass实例
  12. std::shared_ptr<MyClass> sptr2 = sptr;
  13. // 调用doSomething方法
  14. sptr->doSomething();
  15. // 当所有shared_ptr实例都超出作用域时,MyClass的析构函数才会被调用
  16. return 0;
  17. }

 

सावधानताएँ

प्रयोगेstd::shared_ptr एतत् कुर्वन् वृत्तसन्दर्भस्थितीनां परिहाराय सावधानाः भवन्तु, येन सन्दर्भगणना कदापि 0 यावत् न पतति, येन संसाधनस्य लीकं भवति ।वृत्तसन्दर्भस्य सन्दर्भे भवन्तः उपयोक्तुं शक्नुवन्तिstd::weak_ptrचक्रं भङ्गयितुं, २.std::weak_ptrसन्दर्भगणना न वर्धयति, केवलं धारयतिstd::shared_ptrसंसाधनानाम् दुर्बलसन्दर्भान् प्रबन्धयन्तु।

एते उदाहरणानि दर्शयन्ति यत् गतिशीलरूपेण आवंटितस्मृतेः प्रबन्धनार्थं स्मार्ट-सूचकानाम् उपयोगः कथं करणीयः यत् संसाधनाः समुचितसमये सम्यक् मुक्ताः भवन्ति इति सुनिश्चितं भवति, स्मृतेः हस्तचलितरूपेण प्रबन्धने सति सामान्यदोषाः परिहरन्ति

 

अन्ये उदाहरणानि

https://www.cnblogs.com/मृत्यु-देव/पृष्ठ/17962676

https://zhuanlan.zhihu.com/p/678722914