c++ অবজ রিসোর্স অ্যাকুইজিশন দ্বারা বোঝানো হয় কি সূচনা(RAII)?




সি++ বই (6)

ম্যানুয়াল মেমরি ম্যানেজমেন্ট একটি দুঃস্বপ্ন যে প্রোগ্রামার আবিষ্কারকারী আবিষ্কার থেকে এড়াতে উপায় উদ্ভাবন করা হয়েছে। আবর্জনা সংগ্রাহকগুলির সাথে প্রোগ্রামিং ভাষাগুলি জীবনকে আরও সহজ করে তোলে তবে কর্মক্ষমতা খরচ করে। এই প্রবন্ধে - গার্বেজ কালেক্টরকে সরিয়ে ফেলা হচ্ছে: রাই ওয়ে , টপটাল ইঞ্জিনিয়ার প্রক্টর পিটার গুডসপিড-নিক্লাউস আমাদেরকে আবর্জনা সংগ্রাহকের ইতিহাসে এক নজর দেয় এবং মালিকানা ও ঋণের ধারণাগুলি কীভাবে তাদের নিরাপত্তা গ্যারান্টির সাথে আপোস না করে গার্বেজ সংগ্রাহকদেরকে নির্মূল করতে সহায়তা করে তা ব্যাখ্যা করে।

রিসোর্স অ্যাকুইজিশন দ্বারা বোঝানো হয় কি সূচনা (RAII)?


এটি একটি অবিশ্বাস্যভাবে শক্তিশালী ধারণাটির জন্য সত্যিই একটি ভয়ানক নাম এবং সম্ভবত 1 টি জিনিস যা C ++ বিকাশকারীরা অন্যান্য ভাষাগুলিতে স্যুইচ করলে মিস করবেন। Scope-bound resource management হিসাবে এই ধারাকে পুনঃনামকরণ করার চেষ্টা করার জন্য কিছুটা আন্দোলন হয়েছে, যদিও এটি এখনও ধরা হয়নি বলে মনে হচ্ছে।

যখন আমরা 'রিসোর্স' বলতে পারি তখন আমাদের কেবল মেমরির মানে নেই - এটি ফাইল হ্যান্ডলগুলি, নেটওয়ার্ক সকেট, ডেটাবেস হ্যান্ডলগুলি, GDI অবজেক্ট হতে পারে ... সংক্ষেপে, যা আমাদের কাছে সীমাবদ্ধ সরবরাহ এবং তাই আমাদেরকে সক্ষম হতে হবে তাদের ব্যবহার নিয়ন্ত্রণ। 'স্কোপ-আবদ্ধ' দৃষ্টিভঙ্গি মানে বস্তুর জীবনকাল একটি পরিবর্তনশীলের সুযোগের সাথে আবদ্ধ, তাই যখন পরিবর্তনশীল সুযোগটি ছাড়িয়ে যায় তখন ধ্বংসকারী সংস্থাকে মুক্ত করবে। এই একটি খুব দরকারী সম্পত্তি এটি ব্যতিক্রম ব্যতিক্রম-সুরক্ষা জন্য তোলে। উদাহরণস্বরূপ, এই তুলনা করুন:

RawResourceHandle* handle=createNewResource();
handle->performInvalidOperation();  // Oops, throws exception
...
deleteResource(handle); // oh dear, never gets called so the resource leaks

রায়ের সাথে এক

class ManagedResourceHandle {
public:
   ManagedResourceHandle(RawResourceHandle* rawHandle_) : rawHandle(rawHandle_) {};
   ~ManagedResourceHandle() {delete rawHandle; }
   ... // omitted operator*, etc
private:
   RawResourceHandle* rawHandle;
};

ManagedResourceHandle handle(createNewResource());
handle->performInvalidOperation();

এই পরবর্তী ক্ষেত্রে, যখন ব্যতিক্রমটি নিক্ষেপ করা হয় এবং স্ট্যাকটি অজানা হয়, স্থানীয় ভেরিয়েবলগুলি ধ্বংস হয় যা আমাদের সংস্থানকে পরিষ্কার করে এবং লিক হয় না তা নিশ্চিত করে।


ডিজাইন প্যাটার্নস প্রকাশের সাথে সি ++ প্রোগ্রামিং বইটি রাইয়ের বর্ণনা দিয়েছে:

  1. সমস্ত সম্পদ অর্জন
  2. সম্পদ ব্যবহার করে
  3. রিলিজ সম্পদ

কোথায়

  • সম্পদ শ্রেণী হিসাবে প্রয়োগ করা হয়, এবং সব পয়েন্টার তাদের চারপাশে বর্গ wrappers আছে (তাদের স্মার্ট পয়েন্টার তৈরীর)।

  • সম্পদগুলি তাদের নির্মাতাদের আহ্বান করে এবং তাদের বিধ্বংসীদের আহ্বান জানিয়ে নিখুঁতভাবে (অধিগ্রহণের বিপরীত ক্রম অনুসারে) অর্জিত হয়।


একটি বস্তুর জীবনকাল তার সুযোগ দ্বারা নির্ধারিত হয়। যাইহোক, কখনও কখনও আমাদের এটি প্রয়োজন হয়, অথবা এটি একটি অবজেক্ট তৈরি করার জন্য এটি দরকারী, যেখানে এটি তৈরি করা হয়েছিল সেই সুযোগের স্বাধীনভাবে বসবাস করে। সি ++ এ, অপারেটর new এমন বস্তু তৈরি করতে ব্যবহৃত হয়। এবং বস্তুর ধ্বংস করতে, অপারেটর delete যেতে পারে। new অপারেটর দ্বারা তৈরি বস্তু গতিশীলভাবে বরাদ্দ করা হয়, অর্থাত গতিশীল মেমরি বরাদ্দ করা হয় ( হিপ বা মুক্ত দোকান বলা হয়)। সুতরাং, new করে তৈরি হওয়া একটি অবজেক্টটি delete ফেলা ব্যবহার করে স্পষ্টভাবে ধ্বংস না হওয়া পর্যন্ত বিদ্যমান থাকবে।

new ব্যবহার এবং delete সময় ঘটতে পারে এমন কিছু ভুল:

  • লিক্ড বস্তু (বা মেমরি): একটি বস্তু বরাদ্দ করতে new ব্যবহার করে এবং বস্তু delete ভুলবেন।
  • প্রারম্ভিক মুছে ফেলুন (বা রেফারেন্স ঝুলন্ত ): অন্য বস্তুর একটি পয়েন্টার ধারণ করে, বস্তুটি delete এবং তারপরে অন্য পয়েন্টারটি ব্যবহার করুন।
  • ডাবল মুছে ফেলুন : দুইবার একটি বস্তু delete চেষ্টা করছেন।

সাধারণত, স্কপড ভেরিয়েবল পছন্দসই হয়। যাইহোক, রাইটি new বিকল্পের বিকল্প হিসাবে ব্যবহার করা যেতে পারে এবং বস্তুটিকে তার সুযোগের স্বাধীনভাবে বাঁচাতে delete করতে পারে। যেমন একটি কৌশল হিপ উপর বরাদ্দ বস্তু নির্দেশক গ্রহণ এবং একটি হ্যান্ডেল / ম্যানেজার বস্তু স্থাপন করা হয়। পরেরটির একটি ধ্বংসকারী যে বস্তু ধ্বংস করার যত্ন নিতে হবে। এটি গ্যারান্টি দেয় যে বস্তুটি অ্যাক্সেস চায় এমন কোনও ফাংশনে উপলব্ধ, এবং হ্যান্ডেল অবজেক্টের জীবদ্দশায় স্পষ্ট পরিচ্ছন্নতার প্রয়োজন ছাড়াই বস্তুটি ধ্বংস হয়ে যায়।

RAII ব্যবহার করা C ++ স্ট্যান্ডার্ড লাইব্রেরি থেকে উদাহরণগুলি std::string এবং std::vector

কোড এই টুকরা বিবেচনা করুন:

void fn(const std::string& str)
{
    std::vector<char> vec;
    for (auto c : str)
        vec.push_back(c);
    // do something
}

যখন আপনি একটি ভেক্টর তৈরি করেন এবং আপনি এটিতে উপাদানগুলিকে ধাক্কা দেন, তখন আপনি এই উপাদানগুলিকে বরাদ্দ ও বরখাস্ত করার বিষয়ে উদ্বিগ্ন নন। ভেক্টরটি হিপে তার উপাদানগুলির জন্য স্থান বরাদ্দ করার জন্য new ব্যবহার করে এবং সেই স্থানটি মুক্ত করতে delete দেয়। আপনি ভেক্টর ব্যবহারকারী হিসাবে আপনি বাস্তবায়ন বিবরণ সম্পর্কে উদ্বিগ্ন না এবং লিক না না ভেক্টর বিশ্বাস করবে। এই ক্ষেত্রে, ভেক্টর তার উপাদানগুলির হ্যান্ডেল বস্তু

RAII ব্যবহার করে এমন স্ট্যান্ডার্ড লাইব্রেরি থেকে অন্যান্য উদাহরণ std::shared_ptr , std::unique_ptr , এবং std::lock_guard

এই কৌশলটির আরেকটি নাম এসবিআরএম , স্কোপ-বান্ড রিসোর্স ম্যানেজমেন্টের জন্য সংক্ষিপ্ত।


এটি একটি প্রোগ্রামিং idiom যা সংক্ষিপ্তভাবে আপনি মানে

  • একটি বর্গের মধ্যে একটি সম্পদ সংযোজন করে (যার কন্সট্রাকটর সাধারণত - তবে প্রয়োজনীয় নয় ** - সম্পদ অর্জন করে এবং এর ধ্বংসকারী সবসময় এটি প্রকাশ করে)
  • ক্লাসের একটি স্থানীয় উদাহরণ মাধ্যমে সম্পদ ব্যবহার *
  • বস্তু সুযোগ সুযোগ পায় যখন সম্পদ স্বয়ংক্রিয়ভাবে মুক্ত করা হয়

এই গ্যারান্টিটি যে সম্পদটি ব্যবহার করার সময় যা ঘটবে তা নিশ্চিত করে, এটি অবশেষে মুক্ত হবে (স্বাভাবিক প্রত্যাবর্তনের কারণে, ধারণকারী বস্তুর ধ্বংস বা কোনও ব্যতিক্রম ব্যতিক্রম)।

এটি C ++ তে ব্যাপকভাবে ব্যবহৃত ভাল অভ্যাস, কারণ সম্পদগুলির সাথে মোকাবিলা করার নিরাপদ উপায় থাকা সত্ত্বেও, এটি আপনার কোডটিকে আরও পরিচ্ছন্ন করে তোলে কারণ আপনাকে প্রধান কার্যকারিতা সহ ত্রুটি হ্যান্ডলিং কোডটি মেশানোর প্রয়োজন নেই।

* আপডেট: "স্থানীয়" অর্থ একটি স্থানীয় পরিবর্তনশীল হতে পারে, অথবা একটি শ্রেণীর একটি nonstatic সদস্য পরিবর্তনশীল হতে পারে। পরবর্তী ক্ষেত্রে, সদস্য পরিবর্তনশীলটি তার মালিক বস্তুর সাথে শুরু এবং ধ্বংস করা হয়।

** আপডেট 2: @ এসবিআই নির্দেশ করে, সম্পদ - যদিও কনস্ট্রাক্টারের ভিতরে বরাদ্দ করা হয় - বাইরেও বরাদ্দ করা যেতে পারে এবং প্যারামিটার হিসাবে পাস করা যেতে পারে।


একটি RAII ক্লাসে তিনটি অংশ রয়েছে:

  1. সম্পদ ধ্বংসকারী মধ্যে অবতরণ করা হয়
  2. ক্লাসের উদাহরণ বরাদ্দ স্ট্যাক হয়
  3. সম্পদ কনস্ট্রাক্টর অর্জিত হয়। এই অংশটি ঐচ্ছিক, কিন্তু সাধারণ।

RAI "রিসোর্স অধিগ্রহণ শুরু হয়।" RAII এর "সংস্থান অধিগ্রহণ" অংশটি যেখানে আপনি এমন কিছু শুরু করেন যা পরে শেষ হবে, যেমন:

  1. একটি ফাইল খোলা
  2. কিছু মেমরি বরাদ্দ
  3. একটি লক অর্জন

"ইনিশিয়ালাইজেশন" অংশটির অর্থ হল অধিগ্রহণটি একটি বর্গের কন্সট্রকটরের ভিতরে ঘটে।

https://www.tomdalling.com/blog/software-design/resource-acquisition-is-initialisation-raii-explained/





raii