শব্দটির অর্থ এবং ধারণাটির অর্থ বোঝা - RAII (রিসোর্স অধিগ্রহণটি ইনিশিয়ালাইজেশন)


110

আপনি কি সি ++ বিকাশকারীগণ দয়া করে RAII কী, এটি গুরুত্বপূর্ণ কেন, এবং এটির অন্যান্য ভাষার সাথে কোনও প্রাসঙ্গিকতা থাকতে পারে কিনা তার একটি ভাল বর্ণনা দিতে পারেন?

আমি কি করতে একটি সামান্য বিট জানি। আমি বিশ্বাস করি এটির জন্য "রিসোর্স অ্যাকুইজিশন ইজ ইনিশিয়ালাইজেশন" for তবে, এই নামটি RAII কী তা আমার (সম্ভবত ভুল) বোঝার সাথে জাগ্রত হয় না: আমি এই ধারণাটি পেয়েছি যে RAII স্ট্যাকের উপর অবজেক্টগুলির সূচনা করার একটি উপায় যেমন, যখন এই পরিবর্তনগুলি সুযোগের বাইরে চলে যায়, ধ্বংসকারীরা স্বয়ংক্রিয়ভাবে সংস্থানগুলি পরিষ্কার করার জন্য বলা হবে।

তাহলে কেন তাকে "ক্লিনআপ ট্রিগার করতে স্ট্যাক ব্যবহার করে" বলা হচ্ছে না (ইউটিএসটিটিসি :)? আপনি কীভাবে সেখান থেকে "আরআইআইআই" তে যাবেন?

এবং আপনি কীভাবে স্ট্যাকের উপর এমন কিছু তৈরি করতে পারেন যা গাদা স্তরে বাস করে এমন কিছুকে পরিষ্কার করার কারণ করে? এছাড়াও, এমন কোনও মামলা রয়েছে যেখানে আপনি আরআইআইআই ব্যবহার করতে পারবেন না? আপনি কি কখনও নিজেকে আবর্জনা সংগ্রহের জন্য আগ্রহী দেখতে পান? কমপক্ষে কোনও আবর্জনা সংগ্রাহক অন্যকে পরিচালনা করার সময় আপনি কিছু বস্তুর জন্য ব্যবহার করতে পারেন?

ধন্যবাদ।


27
UTSTTC? আমি এটা পছন্দ করি! এটি আরআইআইয়ের চেয়ে অনেক বেশি স্বজ্ঞাত। RAII এর খারাপ নাম দেওয়া হয়েছে, আমি সন্দেহ করি যে কোনও সি ++ প্রোগ্রামার এতে বিরোধ করবে dispute তবে এটি পরিবর্তন করা সহজ নয়। ;)
জাল্ফ

10
এখানে এ বিষয়ে স্ট্রোভস্ট্রুপের দৃষ্টিভঙ্গি এর groups.google.com/group/comp.lang.c++.moderated/msg/...
এসবিআই

3
@ এসবিআই: যাইহোক, কেবল historicalতিহাসিক গবেষণার জন্য আপনার মন্তব্যে +1 করুন। আমি বিশ্বাস করি যে কোনও ধারণার নাম (আরএআইআই) এর জন্য লেখকের (বি। স্ট্রস্ট্রপ) দৃষ্টিভঙ্গি থাকা তার নিজস্ব উত্তর পাওয়ার জন্য যথেষ্ট আকর্ষণীয়।
পেরেেসবাল

1
@ পেয়ারসাবল: researchতিহাসিক গবেষণা? এখন আপনি আমাকে অনেক বৃদ্ধ মনে করছেন। :(আমি পুরো থ্রেডটি পড়ছিলাম, তখনও, এবং এমনকি আমি নিজেকে সি ++ নবাগত মনে করি না!
এসবিআই

3
+1, আমি একই প্রশ্ন করতে চলেছিলাম, খুশি যে আমিই একমাত্র নই যিনি ধারণাটি বুঝতে পেরেছেন তবে নামটির কোনও ধারণা রাখেন না। মনে হয় এটিকে আরএওআই বলা উচিত ছিল - রিসোর্স অ্যাকুইজেশন অন ইনিশিয়ালেশন।
লরেন্ট

উত্তর:


132

তাহলে কেন তাকে "ক্লিনআপ ট্রিগার করতে স্ট্যাক ব্যবহার করে" বলা হচ্ছে না (ইউটিএসটিটিসি :)?

RAII আপনাকে কী বলছে: কোনও কনস্ট্রাক্টরে আপনার সংস্থান অর্জন করুন! আমি যুক্ত করব: একটি সংস্থান, একজন নির্মাতা। ইউটিএসটিটিসি এটির একটি মাত্র অ্যাপ্লিকেশন, আরআইআই আরও অনেক কিছু।

রিসোর্স ম্যানেজমেন্ট চুষছে। এখানে, সংস্থান হ'ল এমন কিছু যা ব্যবহারের পরে পরিষ্কারের প্রয়োজন। অনেক প্ল্যাটফর্ম জুড়ে প্রকল্পগুলির অধ্যয়নগুলি দেখায় যে বেশিরভাগ বাগ সম্পদ পরিচালনার সাথে সম্পর্কিত - এবং এটি উইন্ডোজে বিশেষত খারাপ (বিভিন্ন ধরণের অবজেক্ট এবং বরাদ্দকারীদের কারণে)।

সি ++ এ, ব্যতিক্রম এবং (সি ++ স্টাইল) টেমপ্লেটের সংমিশ্রণের কারণে সংস্থানগুলি বিশেষত জটিল। হুডের নীচে উঁকি দেওয়ার জন্য, GOTW8 দেখুন )।


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

আসুন আমরা একটি অতিরিক্ত সরল FileHandleশ্রেণীর সাথে আরআইআই নিয়োগ দিয়ে শুরু করি :

class FileHandle
{
    FILE* file;

public:

    explicit FileHandle(const char* name)
    {
        file = fopen(name);
        if (!file)
        {
            throw "MAYDAY! MAYDAY";
        }
    }

    ~FileHandle()
    {
        // The only reason we are checking the file pointer for validity
        // is because it might have been moved (see below).
        // It is NOT needed to check against a failed constructor,
        // because the destructor is NEVER executed when the constructor fails!
        if (file)
        {
            fclose(file);
        }
    }

    // The following technicalities can be skipped on the first read.
    // They are not crucial to understanding the basic idea of RAII.
    // However, if you plan to implement your own RAII classes,
    // it is absolutely essential that you read on :)



    // It does not make sense to copy a file handle,
    // hence we disallow the otherwise implicitly generated copy operations.

    FileHandle(const FileHandle&) = delete;
    FileHandle& operator=(const FileHandle&) = delete;



    // The following operations enable transfer of ownership
    // and require compiler support for rvalue references, a C++0x feature.
    // Essentially, a resource is "moved" from one object to another.

    FileHandle(FileHandle&& that)
    {
        file = that.file;
        that.file = 0;
    }

    FileHandle& operator=(FileHandle&& that)
    {
        file = that.file;
        that.file = 0;
        return *this;
    }
}

যদি নির্মাণ ব্যর্থ হয় (ব্যতিক্রম সহ), অন্য কোনও সদস্যের ফাংশন - এমনকি ধ্বংসকারীও নয় - ডেকে আনা হয়।

RAII অবৈধ অবস্থায় অবজেক্টগুলি ব্যবহার করা এড়িয়ে চলে। আমরা বস্তুটি ব্যবহার করার আগেই এটি ইতিমধ্যে জীবনকে আরও সহজ করে তোলে।

এখন, আসুন অস্থায়ী বস্তুগুলির দিকে নজর দেওয়া যাক:

void CopyFileData(FileHandle source, FileHandle dest);

void Foo()
{
    CopyFileData(FileHandle("C:\\source"), FileHandle("C:\\dest"));
}

হ্যান্ডেল করার জন্য এখানে তিনটি ত্রুটিযুক্ত মামলা রয়েছে: কোনও ফাইল খোলা যায় না, কেবল একটি ফাইলই খোলা যায়, দুটি ফাইলই খোলা যেতে পারে তবে ফাইলগুলি অনুলিপি করা ব্যর্থ হয়েছে। একটি অ-আরআইআইআই বাস্তবায়নে, Fooতিনটি ক্ষেত্রেই স্পষ্টভাবে পরিচালনা করতে হবে।

এক বিবৃতিতে একাধিক সংস্থান অর্জিত হয়ে গেলেও, আরআইআই অধিগ্রহণ করা সংস্থানগুলি প্রকাশ করে।

এখন আসুন কিছু বস্তুকে একত্রিত করি:

class Logger
{
    FileHandle original, duplex;   // this logger can write to two files at once!

public:

    Logger(const char* filename1, const char* filename2)
    : original(filename1), duplex(filename2)
    {
        if (!filewrite_duplex(original, duplex, "New Session"))
            throw "Ugh damn!";
    }
}

এর কনস্ট্রাক্টর Loggerব্যর্থ হবে যদি originalকনস্ট্রাক্টর ব্যর্থ হয় (কারণ filename1ওপেন করা যায়নি), duplexএর কনস্ট্রাক্টর ব্যর্থ হয় (কারণ filename2ওপেন করা যায়নি), অথবা Loggerকনস্ট্রাক্টর বডির ভিতরে থাকা ফাইলগুলিতে লিখন ব্যর্থ হয়। এর যে কোনও ক্ষেত্রেই Loggerএর ডেস্ট্রাক্টরকে ডাকা হবে না - তাই আমরা Loggerফাইলগুলি প্রকাশের জন্য ডেস্ট্রাক্টরের উপর নির্ভর করতে পারি না । তবে যদি originalএটি নির্মাণ করা হয় তবে Loggerকনস্ট্রাক্টরের ক্লিনআপ চলাকালীন তার ধ্বংসকারীকে ডাকা হবে ।

আঞ্চলিক নির্মাণের পরে আরএআইআই সাফাই সহজসাধ্য করে।


নেতিবাচক পয়েন্ট:

নেতিবাচক পয়েন্টগুলি? সমস্ত সমস্যাগুলি RAII এবং স্মার্ট পয়েন্টারগুলির সাথে সমাধান করা যেতে পারে ;-)

যখন আপনার যখন বিলম্বিত অধিগ্রহণের প্রয়োজন হয়, সম্মিলিত বস্তুগুলি গাদাতে ঠেলাঠেলি করে তখন কখনও কখনও আরআইআই অপ্রয়োজনীয় হয়।
কল্পনা করুন লগারের একটি দরকার SetTargetFile(const char* target)। সেক্ষেত্রে, হ্যান্ডেলটি, যার এখনও সদস্য হওয়া দরকার Logger, এটি হিপগুলিতে থাকা উচিত (উদাহরণস্বরূপ স্মার্ট পয়েন্টারে, হ্যান্ডেলের ধ্বংসটিকে যথাযথভাবে ট্রিগার করতে))

আমি সত্যিই আবর্জনা সংগ্রহের জন্য কখনও চাইনি। আমি যখন সি # করি তখন আমি মাঝে মাঝে আনন্দের একটি মুহুর্ত অনুভব করি যা আমার কেবল যত্নের প্রয়োজন হয় না, তবে আরও অনেক কিছুই আমি মিস করি যে সব শীতল খেলনা যা নির্বিচারে ধ্বংসের মাধ্যমে তৈরি করা যায়। ( IDisposableশুধু ব্যবহার করে এটি কাটবে না))

আমার একটি বিশেষ জটিল কাঠামো রয়েছে যা সম্ভবত জিসি থেকে উপকৃত হয়েছিল, যেখানে "সাধারণ" স্মার্ট পয়েন্টারগুলি একাধিক ক্লাসের উপর বিজ্ঞপ্তিযুক্ত রেফারেন্স তৈরি করতে পারে। আমরা সাবধানে শক্তিশালী এবং দুর্বল পয়েন্টারগুলিতে ভারসাম্য বজায় রেখে বিভ্রান্ত হয়েছি, তবে যে কোনও সময় আমরা কোনও কিছু পরিবর্তন করতে চাই, আমাদের একটি বড় সম্পর্কের চার্টটি অধ্যয়ন করতে হবে। জিসি আরও ভাল হতে পারে তবে কিছু উপাদান সংস্থান রেখেছিল যেগুলি ASAP প্রকাশ করা উচিত।


ফাইলহ্যান্ডলের নমুনায় একটি নোট: এটি সম্পূর্ণ হওয়ার উদ্দেশ্যে নয়, কেবল একটি নমুনা - তবে ভুল প্রমাণিত হয়েছে। সঠিক সি ++ 0x সমাধানে রূপান্তরিত করার জন্য জোহানেস স্কাউব এবং ফ্রেডওভারফ্লোকে ধন্যবাদ জানাই। সময়ের সাথে সাথে, আমি এখানে নথিভুক্ত পদ্ধতির সাথে স্থির হয়েছি ।


1
+1 দেখানোর জন্য যে জিসি এবং এএসএপ জাল হয় না। প্রায়শই ক্ষতি করে না তবে যখন এটি নির্ণয় করা সহজ হয় না: /
ম্যাথিউ এম।

10
একটি বিশেষত বাক্য যা আমি আগে পড়াতে উপেক্ষা করেছিলাম। আপনি বলেছিলেন যে "RAII" আপনাকে বলছে, "কনস্ট্রাক্টরের ভিতরে আপনার সংস্থানগুলি অর্জন করুন" " এটি উপলব্ধি করে এবং প্রায় "RAII" এর শব্দ-শব্দের সংজ্ঞা দেয় ra এখন আমি এটি আরও ভাল করে পেয়েছি (আমি যদি আপনাকে পারতাম তবেই আপনাকে ভোট দিয়ে দেব :)
চার্লি ফ্লাওয়ার

2
জিসির একটি বড় সুবিধা হ'ল একটি মেমরি বরাদ্দ কাঠামো "অনিরাপদ" কোডের অনুপস্থিতিতে ঝুঁকিপূর্ণ রেফারেন্স তৈরি করতে বাধা দিতে পারে (যদি "অনিরাপদ" কোড অনুমোদিত হয় তবে অবশ্যই ফ্রেমওয়ার্কটি কোনও কিছুই আটকাতে পারে না)। স্ট্রিংয়ের মতো ভাগ করা অপরিবর্তনীয় অবজেক্টের সাথে ডিল করার সময় জিসি প্রায়শই আরআইআইয়ের চেয়েও উচ্চতর হয় যার প্রায়শই কোনও পরিষ্কার মালিক থাকে না এবং কোনও পরিষ্কারের প্রয়োজন হয় না। এটি দুর্ভাগ্যজনক যে আরও ফ্রেমওয়ার্কগুলি জিসি এবং আরআইআই একত্রিত করার চেষ্টা করে না, যেহেতু বেশিরভাগ অ্যাপ্লিকেশনগুলিতে অপরিবর্তনীয় বস্তুর মিশ্রণ থাকবে (যেখানে জিসি সবচেয়ে ভাল হবে) এবং যে জিনিসগুলিতে ক্লিনআপ প্রয়োজন (যেখানে আরআইআই সবচেয়ে ভাল) তার প্রয়োজন হবে।
সুপারক্যাট

@ সুপের্যাট: আমি সাধারণত জিসি পছন্দ করি - তবে এটি কেবল জিসি "বোঝে" রিসোর্সগুলির জন্য কাজ করে। যেমন। নেট জিসি COM অবজেক্টের দাম জানেন না। এগুলি কেবল কোনও লুপে তৈরি এবং ধ্বংস করার সময়, এটি আনন্দের সাথে অ্যাপ্লিকেশনটিকে ঠিকানা স্পেস বা ভার্চুয়াল মেমরি - যা কিছু আসে প্রথমে - এমনকি কোনও জিসি করার চিন্তা না করেই গ্রাউন্ডে চলে যেতে দেবে। --- তদ্ব্যতীত, পুরোপুরি একটি GC'd পরিবেশেও আমি এখনও নির্বিচার ধ্বংসের শক্তিটি মিস করছি: আপনি একই ধাঁচটি অন্য আর্টিটিয়েটে প্রয়োগ করতে পারেন, উদাহরণস্বরূপ, সিটিয়ান শর্তে ইউআই উপাদান দেখানো।
পিটারচেন

@ পিটারচেন: আমি মনে করি যে একটি বিষয় অনেকগুলি ওওপি-সম্পর্কিত চিন্তায় অনুপস্থিত, তা হ'ল অবজেক্টের মালিকানার ধারণা। সম্পদের অধিকারী অবজেক্টের জন্য প্রায়শই মালিকানার খোঁজ রাখা স্পষ্টভাবে প্রয়োজনীয়, তবে প্রায়শই সম্পদবিহীন পরিবর্তিত বস্তুর জন্যও প্রয়োজনীয়। সাধারণভাবে, অবজেক্টগুলি তাদের পারস্পরিক পরিবর্তন স্থিতিগুলি সম্ভবত ভাগ করে নেওয়া অব্যবহারযোগ্য অবজেক্টগুলির উল্লেখে বা এমন এক পরিবর্তিত স্থানে যার দ্বারা তারা একচেটিয়া মালিক enc এই ধরনের একচেটিয়া মালিকানা অগত্যা একচেটিয়া লেখার অ্যাক্সেস পরোক্ষভাবে না, কিন্তু যদি Fooমালিক Bar, এবং Bozmutates এটা ...
supercat

42

সেখানে দুর্দান্ত উত্তর আছে, তাই আমি কিছু ভুলে যাওয়া জিনিস যুক্ত করছি।

0. RAII স্কোপগুলি সম্পর্কে

আরআইআই উভয় সম্পর্কে:

  1. কনস্ট্রাক্টরে রিসোর্স (কোনও রিসোর্স যাই হোক না কেন) অর্জন করা এবং ডিস্ট্রাক্টরটিতে এটি অ-অধিগ্রহণ করা।
  2. ভেরিয়েবল ঘোষণার সময় কনস্ট্রাক্টরকে মৃত্যুদন্ড কার্যকর করা এবং ভেরিয়েবল সুযোগের বাইরে চলে গেলে ডেস্ট্রাক্টর স্বয়ংক্রিয়ভাবে কার্যকর করা হয়।

অন্যরা ইতিমধ্যে এর সম্পর্কে উত্তর দিয়েছিল, তাই আমি বিস্তারিত জানাব না।

1. জাভা বা সি # তে কোডিং করার সময় আপনি ইতিমধ্যে RAII ব্যবহার করেন ...

মনসির জুরডাইন: কি! যখন আমি বলি, "নিকোল, আমার চপ্পল নিয়ে এস এবং আমার নাইটক্যাপটি দাও" গদ্যটি কি?

ফিলোসফি মাস্টার: হ্যাঁ স্যার।

মনসিউর জুরডেইন: চল্লিশ বছরেরও বেশি সময় ধরে আমি এ সম্পর্কে কিছুই না জেনে গদ্যের কথা বলছি এবং আমাকে তা শিখিয়ে দেওয়ার জন্য আমি আপনার কাছে অনেক বাধ্য।

- মলিয়ার: মধ্যবিত্ত ভদ্রলোক, আইন 2, দৃশ্য 4

মনসিয়র জর্দাইন যেমন গদ্য দিয়েছিলেন, সি # এবং এমনকি জাভা লোকেরা ইতিমধ্যে RAII ব্যবহার করে তবে লুকানো উপায়ে। উদাহরণস্বরূপ, নিম্নলিখিত জাভা কোড (যা প্রতিস্থাপনের synchronizedমাধ্যমে সি # তে একইভাবে লেখা আছে lock):

void foo()
{
   // etc.

   synchronized(someObject)
   {
      // if something throws here, the lock on someObject will
      // be unlocked
   }

   // etc.
}

... ইতিমধ্যে RAII ব্যবহার করছে: শব্দটি ( synchronizedবা lock) শব্দটিতে মিটেক্স অধিগ্রহণটি সম্পন্ন হয় এবং সুযোগ ছাড়ার সময় আন-অধিগ্রহণ করা হবে।

এটি এর স্বরলিপিতে এতটাই স্বাভাবিক যে এমনকি আরআইআইআই সম্পর্কে কখনও শোনেনি এমন লোকদের জন্য এটি প্রায় কোনও ব্যাখ্যা প্রয়োজন।

জাভা এবং সি # এর উপরে সি ++ এর সুবিধাটি হ'ল RAII ব্যবহার করে যে কোনও কিছু তৈরি করা যায়। উদাহরণস্বরূপ, সি ++ এর সাথে সরাসরি কোনও বিল্ড-ইন সমতুল্য synchronizedনেই lock, তবে আমরা সেগুলি এখনও পেতে পারি।

সি ++ তে এটি লেখা হবে:

void foo()
{
   // etc.

   {
      Lock lock(someObject) ; // lock is an object of type Lock whose
                              // constructor acquires a mutex on
                              // someObject and whose destructor will
                              // un-acquire it 

      // if something throws here, the lock on someObject will
      // be unlocked
   }

   // etc.
}

যা সহজেই জাভা / সি # উপায়ে (সি ++ ম্যাক্রোগুলি ব্যবহার করে) লেখা যেতে পারে:

void foo()
{
   // etc.

   LOCK(someObject)
   {
      // if something throws here, the lock on someObject will
      // be unlocked
   }

   // etc.
}

২.আরআইআই এর বিকল্প ব্যবহার রয়েছে

হোয়াইট র‌্যাবিট: [গান গাওয়া] আমি দেরী / খুব দেরিতে / খুব গুরুত্বপূর্ণ তারিখের জন্য। / "হ্যালো" বলার সময় নেই। / বিদায়। / আমি দেরি করছি, আমি দেরি করেছি, দেরি করেছি।

- এলিস ইন ওয়ান্ডারল্যান্ড (ডিজনি সংস্করণ, 1951)

আপনি কী জানেন কখন কন্সট্রাক্টরকে ডাকা হবে (অবজেক্ট ডিক্লেয়ারেশনে), এবং আপনি জানেন যে এর সাথে সম্পর্কিত ডস্ট্রাক্টর কখন ডাকা হবে (স্কোপটি থেকে প্রস্থান করার সময়), সুতরাং আপনি একটি লাইনের সাথে প্রায় জাদুকরী কোড লিখতে পারবেন। C ++ আশ্চর্যজনক দেশটিতে স্বাগতম (কমপক্ষে, C ++ বিকাশকারীর দৃষ্টিকোণ থেকে)।

উদাহরণস্বরূপ, আপনি একটি পাল্টা অবজেক্ট লিখতে পারেন (আমি এটি একটি অনুশীলন হিসাবে দিই) এবং উপরে এটির লক অবজেক্টটি যেমন ব্যবহার করা হয়েছিল ঠিক তেমন তার পরিবর্তনশীল ঘোষণা করে এটি ব্যবহার করতে পারে:

void foo()
{
   double timeElapsed = 0 ;

   {
      Counter counter(timeElapsed) ;
      // do something lengthy
   }
   // now, the timeElapsed variable contain the time elapsed
   // from the Counter's declaration till the scope exit
}

অবশ্যই কোনটি আবার, ম্যাক্রো ব্যবহার করে জাভা / সি # উপায়ে লেখা যায়:

void foo()
{
   double timeElapsed = 0 ;

   COUNTER(timeElapsed)
   {
      // do something lengthy
   }
   // now, the timeElapsed variable contain the time elapsed
   // from the Counter's declaration till the scope exit
}

৩. সি ++ এর অভাব কেন finally?

[শোটিং] এটি চূড়ান্ত গণনা!

- ইউরোপ: ফাইনাল কাউন্টডাউন (দুঃখিত, আমি উদ্ধৃতিগুলি বাইরে ছিলাম, এখানে ... :-)

finallyস্কোপটি প্রস্থান করার ক্ষেত্রে রিসোর্স ডিসপ্লে পরিচালনা করতে (# হয় returnবা নিক্ষিপ্ত ব্যতিক্রমের মাধ্যমে) এই ধারাটি সি # / জাভাতে ব্যবহৃত হয় ।

চমত্কার স্পেসিফিকেশন পাঠকদের লক্ষ্য করা হবে যে সি ++ এর শেষ অবধি নেই। এবং এটি ত্রুটি নয়, কারণ সি ++ এর এটির প্রয়োজন নেই, যেমন RAII ইতিমধ্যে সম্পদ নিষ্পত্তি পরিচালনা করে। (এবং আমার বিশ্বাস করুন, সি ++ ডিস্ট্রাক্টর লেখার জন্য জাভা সঠিকভাবে অবধি, এমনকি সি-র সঠিক নিষ্পত্তি পদ্ধতিও লেখার চেয়ে প্রসার সহজ)।

তবুও, কখনও কখনও, একটি finallyধারাটি শীতল হবে। আমরা কি এটি সি ++ এ করতে পারি? হ্যাঁ আমরা পারি! এবং আবার RAII এর বিকল্প ব্যবহার সহ।

উপসংহার: আরআইআই সি ++ তে দর্শনের চেয়ে অনেক বেশি: এটি সি ++

RAII? এটি সি ++ !!!

- সি ++ বিকাশকারীর ক্ষোভজনক মন্তব্য, নির্লজ্জভাবে স্পার্টার একজন অস্পষ্ট রাজা এবং তার 300 বন্ধুরা অনুলিপি করেছেন

আপনি যখন সি ++ এর কিছু স্তরের অভিজ্ঞতার পর্যায়ে পৌঁছান, আপনি আরএআইআই এর শর্তে, কনস্ট্র্রটর এবং ডেস্ট্রাক্টরদের স্বয়ংক্রিয় প্রয়োগের ক্ষেত্রে বিবেচনা শুরু করেন

আপনি স্কোপের পরিপ্রেক্ষিতে চিন্তাভাবনা শুরু করেন {এবং এবং কোডগুলি} আপনার কোডে সর্বাধিক গুরুত্বপূর্ণ হয়ে ওঠে।

এবং প্রায় সমস্ত কিছুই RAII- র শর্তাবলী অনুসারে যথাযথভাবে খাপ খায়: ব্যতিক্রমী সুরক্ষা, মিটেক্সেস, ডাটাবেস সংযোগ, ডাটাবেস অনুরোধ, সার্ভার সংযোগ, ঘড়ি, ওএস হ্যান্ডলগুলি, ইত্যাদি, এবং শেষ, তবে কমপক্ষে নয় memory

ডাটাবেসের অংশটি নগণ্য নয়, কারণ, আপনি যদি দামটি দিতে স্বীকার করেন, আপনি এমনকি " লেনদেনের প্রোগ্রামিং " স্টাইলে লিখতে পারেন , সিদ্ধান্ত নেওয়ার আগ পর্যন্ত কোডের লাইন এবং কোডগুলি লাইন করতে পারেন, যদি আপনি সমস্ত পরিবর্তন করতে চান , বা সম্ভব না হলে সমস্ত পরিবর্তন ফিরিয়ে দেওয়া (যতক্ষণ না প্রতিটি লাইন কমপক্ষে দৃ Ex় ব্যতিক্রমী গ্যারান্টিটি পূরণ করে)। ( লেনদেনের প্রোগ্রামিংয়ের জন্য এই হার্বের সুটার নিবন্ধের দ্বিতীয় অংশটি দেখুন )।

এবং ধাঁধা মত, সব ফিট করে।

RAII C ++ এর অনেক অংশ, সি ++ এটি ছাড়া সি ++ হতে পারে না।

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

এবং এটি ব্যাখ্যা করে যে কেন আবর্জনা সংগ্রাহক, যদিও নিজের মধ্যে প্রযুক্তির একটি দুর্দান্ত অংশ, একটি সি ++ বিকাশকারীর দৃষ্টিকোণ থেকে এতটা চিত্তাকর্ষক নয়:

  • আরআইআইআই ইতিমধ্যে জিসি দ্বারা পরিচালিত বেশিরভাগ মামলা পরিচালনা করে
  • খাঁটি পরিচালিত অবজেক্টের উপর বিজ্ঞপ্তি রেফারেন্স সহ একটি জিসি আরআইআই এর চেয়ে ভাল আচরণ করে (দুর্বল পয়েন্টারগুলির স্মার্ট ব্যবহার দ্বারা প্রশমিত)
  • এখনও একটি জিসি মেমরির মধ্যে সীমাবদ্ধ, আরআইআইআই যে কোনও ধরণের সংস্থান পরিচালনা করতে পারে।
  • উপরে বর্ণিত হিসাবে, আরআইআই আরও অনেক কিছু করতে পারে ...

একটি জাভা ফ্যান: আমি বলব যে জিসি আরআইআই এর চেয়ে অনেক বেশি কার্যকর কারণ এটি সমস্ত স্মৃতি পরিচালনা করে এবং আপনাকে অনেকগুলি সম্ভাব্য বাগ থেকে মুক্তি দেয়। জিসির সাহায্যে আপনি বিজ্ঞপ্তি রেফারেন্স তৈরি করতে পারেন, রিটার্ন ও স্টোর রেফারেন্স তৈরি করতে পারেন এবং এটিকে ভুল করা শক্ত হয় (একটি স্বল্পমেয়াদী অবজেক্টের রেফারেন্স সংরক্ষণ করে এটি তার লাইভ সময়কে দীর্ঘায়িত করে, যা এক ধরণের মেমরি ফাঁস, তবে এটিই কেবল সমস্যা) । জিসি দিয়ে সংস্থানগুলি হ্যান্ডলগুলি কাজ করে না, তবে একটি অ্যাপ্লিকেশনের বেশিরভাগ সংস্থার মধ্যে একটি তুচ্ছ লাইভ চক্র থাকে এবং বাকি কয়েকটি সংস্থাগুলি কোনও বড় বিষয় নয়। আমি আশা করি আমাদের জিসি এবং আরআইআই উভয়ই থাকতে পারতাম, তবে এটি অসম্ভব বলে মনে হচ্ছে।
মার্টিনাস

16

1
এগুলির মধ্যে কিছু আমার প্রশ্নের সাথে সামঞ্জস্যপূর্ণ, তবে অনুসন্ধানে সেগুলি সক্রিয় করা যায়নি, বা আপনার কোনও নতুন প্রশ্ন প্রবেশের পরে উপস্থিত "সম্পর্কিত প্রশ্নগুলি" তালিকাটিও দেখা যায় নি। লিঙ্কগুলির জন্য ধন্যবাদ।
চার্লি ফুল

1
@ চার্লি: অনুসন্ধানে বিল্ড কিছু উপায়ে খুব দুর্বল। ট্যাগ সিনট্যাক্স ("[বিষয়]") ব্যবহার করা খুব সহায়ক, এবং অনেক লোক গুগল ব্যবহার করেন ...
ডেমকে --- --- প্রাক্তন-মধ্যযন্ত্রের বিড়ালছানা

10

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

SmartPointer pointer( new ObjectClass() );

স্মার্ট পয়েন্টার যখন সুযোগের বাইরে চলে যায় তখন পয়েন্টার শ্রেণির ডেস্ট্রাক্টর সংযুক্ত বস্তুটি মুছে দেয়। পয়েন্টারটি স্ট্যাক-বরাদ্দ এবং বস্তু - গাদা-বরাদ্দ।

কিছু কিছু ক্ষেত্রে আছে যখন RAII সহায়তা করে না। উদাহরণস্বরূপ, আপনি যদি রেফারেন্স-কাউন্টিং স্মার্ট পয়েন্টারগুলি (বুস্ট :: শেয়ার্ড_পিটারের মতো) ব্যবহার করেন এবং একটি চক্রের সাথে একটি গ্রাফের মতো কাঠামো তৈরি করেন যা আপনার মেমরি ফুটো হওয়ার ঝুঁকিপূর্ণ কারণ কোনও চক্রের অবজেক্টগুলি একে অপরকে মুক্তি দেওয়া থেকে বিরত রাখবে। আবর্জনা সংগ্রহ এর বিরুদ্ধে সহায়তা করবে।


2
সুতরাং এটি ইউসিডিএসটিএমআর বলা উচিত :)
ড্যানিয়েল দারানাস

দ্বিতীয় চিন্তায়, আমি ইউডিএসটিএমআর আরও উপযুক্ত বলে মনে করি। ভাষা (সি ++) দেওয়া হয়েছে, তাই সংক্ষিপ্ত আকারে "সি" বর্ণটি দরকার নেই। ইউডিএসটিএমআর বলতে রিসোর্সগুলি পরিচালনা করতে ডেস্ট্রাক্টর সিমানটিক্স ব্যবহার করে।
ড্যানিয়েল দারানাস

9

পূর্ববর্তী প্রতিক্রিয়াগুলির পরে আমি এটি আরও দৃ strongly়তার সাথে রাখতে চাই।

আরআইআইআই, রিসোর্স অ্যাকুইজিশন ইজ ইনিশিয়ালাইজেশন এর অর্থ হ'ল সমস্ত অর্জিত সম্পদ কোনও সামগ্রীর সূচনার প্রেক্ষাপটে অর্জন করা উচিত। এটি "নগ্ন" সম্পদ অর্জন নিষিদ্ধ করে। যুক্তিটি হ'ল সি ++ এ পরিষ্কার করা ফাংশন-কল ভিত্তিতে নয়, অবজেক্ট ভিত্তিতে কাজ করে। সুতরাং, সমস্ত ক্লিনআপ ফাংশন কল দ্বারা নয়, অবজেক্ট দ্বারা করা উচিত। এই অর্থে সি ++ হ'ল আরও-অবজেক্ট ওরিয়েন্টেড, যেমন জাভা। জাভা ক্লিনআপ finallyক্লজগুলিতে ফাংশন কলগুলির উপর ভিত্তি করে ।


দুর্দান্ত উত্তর। এবং "একটি বস্তুর সূচনা" মানে "কনস্ট্রাক্টর", হ্যাঁ?
চার্লি ফুল

@ চার্লি: হ্যাঁ, বিশেষত এই ক্ষেত্রে।
এমসাল্টার্স

8

আমি সিপাইটিস সঙ্গে সম্মত। তবে যুক্ত করতে চাই যে সংস্থানগুলি কেবল স্মৃতি নয় কিছু হতে পারে। সংস্থানটি কোনও ফাইল, একটি সমালোচনামূলক বিভাগ, একটি থ্রেড বা একটি ডাটাবেস সংযোগ হতে পারে।

এটিকে রিসোর্স অ্যাকুইজিশন ইজ ইনিশিয়ালাইজেশন বলা হয় কারণ যখন রিসোর্স নিয়ন্ত্রণকারী অবজেক্টটি নির্মাণ করা হয় তখন রিসোর্স অর্জিত হয়, যদি কনস্ট্রাক্টর ব্যর্থ হয় (অর্থাৎ ব্যতিক্রমের কারণে) রিসোর্স অর্জিত হয় না। তারপরে অবজেক্টটি সুযোগের বাইরে চলে গেলে সম্পদটি প্রকাশিত হয়। সি ++ গ্যারান্টি দেয় যে স্ট্যাকের সাফল্যের সাথে নির্মিত সমস্ত বস্তু ধ্বংস হয়ে যাবে (এতে বেস ক্লাসের কনস্ট্রাক্টর এবং সদস্যরা এমনকি সুপার ক্লাসের কনস্ট্রাক্টর ব্যর্থ হলেও)।

আরআইআইয়ের পিছনে যুক্তি হ'ল সম্পদ অধিগ্রহণ ব্যতিক্রম নিরাপদ করা। যে সমস্ত প্রাপ্ত সম্পদ যথাযথভাবে ছেড়ে দেওয়া হয় যেখানেই তার ব্যতিক্রম ঘটুক না কেন। তবে এটি যে শ্রেণীর সংস্থানটি অর্জন করে তার মানের উপর নির্ভর করে না (এটি অবশ্যই ব্যতিক্রম নিরাপদ এবং এটি কঠিন)।


দুর্দান্ত, নামের পিছনে যুক্তি ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ। যেহেতু আমি এটি বুঝতে পারি, আপনি RAII হিসাবে প্যারাফ্রেস করতে পারেন, "(কন্সট্রাক্টর-ভিত্তিক) আরম্ভের পরিবর্তে অন্য কোনও পদ্ধতির মাধ্যমে কোনও সংস্থান কখনও অর্জন করবেন না"। হ্যাঁ?
চার্লি ফুলগুলি

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

আমি তাদের লিখতে খুব কঠিন পাই না। যদি আপনার ক্লাসগুলি যথাযথভাবে ছোট হয় তবে এগুলি মোটেই কঠিন নয়।
রব কে

7

আবর্জনা সংগ্রহের সমস্যাটি হ'ল আপনি হ'ল রক্ষণাত্মক ধ্বংসটি যা আরআইআইয়ের পক্ষে অত্যন্ত গুরুত্বপূর্ণ। একবার কোনও ভেরিয়েবল সুযোগের বাইরে চলে গেলে, আবর্জনা সংগ্রহ করার বিষয়টি আবর্জনা সংগ্রহকারীর হাতে। অবজেক্টটি যে রিসোর্সটিকে ধরে রেখেছে সেগুলি ডিস্ট্রাক্টর ডেকে না আসা পর্যন্ত রাখা অব্যাহত থাকবে।


4
সমস্যাটি কেবল নির্ধারণবাদই নয়। আসল সমস্যাটি হ'ল ফাইনালাইজাররা (জাভা নামকরণ) জিসির পথে চলে। জিসি দক্ষ, কারণ এটি মৃত জিনিসগুলিকে স্মরণ করে না, বরং এগুলি বিস্মৃতিতে উপেক্ষা করে। চিকিত্সকদের নিশ্চয়তার জন্য
গিফিকে

1
জাভা / সি # ব্যতীত আপনি সম্ভবত কোনও ফাইনালাইজারের পরিবর্তে শেষ অবধি পরিষ্কার করতে পারবেন।
জে কে।

4

আরএআইআই রিসোর্স অ্যালোকেশন ইজ ইনিশিয়ালেশন থেকে আসে। মূলত, এর অর্থ হ'ল যখন কোনও কনস্ট্রাক্টর নির্বাহ শেষ করে, তখন নির্মিত নির্মিত বস্তু সম্পূর্ণরূপে আরম্ভ হয় এবং ব্যবহারের জন্য প্রস্তুত। এটি আরও বোঝায় যে বিনষ্টকারী বস্তুর মালিকানাধীন যে কোনও সংস্থান (যেমন মেমরি, ওএস সংস্থানসমূহ) প্রকাশ করবেন।

আবর্জনা সংগৃহীত ভাষা / প্রযুক্তিগুলির সাথে তুলনা করে (যেমন জাভা,। নেট), সি ++ কোনও সামগ্রীর জীবনের সম্পূর্ণ নিয়ন্ত্রণের অনুমতি দেয়। স্ট্যাক বরাদ্দকৃত অবজেক্টের জন্য, আপনি জানতে পারবেন কখন কখন অবজেক্টের ডেস্ট্রাক্টর ডেকে আনা হবে (যখন এক্সিকিউশন সুযোগের বাইরে চলে যায়), এমন জিনিস যা আবর্জনা সংগ্রহের ক্ষেত্রে সত্যিই নিয়ন্ত্রণ করা হয় না। এমনকি সি ++ (যেমন বুস্ট :: শেয়ার্ড_পিটার) তে স্মার্ট পয়েন্টার ব্যবহার করেও আপনি জানবেন যে যখন পয়েন্টের অবজেক্টের কোনও রেফারেন্স নেই তখন object অবজেক্টের ডেস্ট্রাক্টর ডেকে আনা হবে।


3

এবং আপনি কীভাবে স্ট্যাকের উপর এমন কিছু তৈরি করতে পারেন যা গাদা স্তরে বাস করে এমন কিছুকে পরিষ্কার করার কারণ করে?

class int_buffer
{
   size_t m_size;
   int *  m_buf;

   public:
   int_buffer( size_t size )
     : m_size( size ), m_buf( 0 )
   {
       if( m_size > 0 )
           m_buf = new int[m_size]; // will throw on failure by default
   }
   ~int_buffer()
   {
       delete[] m_buf;
   }
   /* ...rest of class implementation...*/

};


void foo() 
{
    int_buffer ib(20); // creates a buffer of 20 bytes
    std::cout << ib.size() << std::endl;
} // here the destructor is called automatically even if an exception is thrown and the memory ib held is freed.

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

class mutex
{
   // ...
   take();
   release();

   class mutex::sentry
   {
      mutex & mm;
      public:
      sentry( mutex & m ) : mm(m) 
      {
          mm.take();
      }
      ~sentry()
      {
          mm.release();
      }
   }; // mutex::sentry;
};
mutex m;

int getSomeValue()
{
    mutex::sentry ms( m ); // blocks here until the mutex is taken
    return 0;  
} // the mutex is released in the destructor call here.

এছাড়াও, এমন কোনও মামলা রয়েছে যেখানে আপনি আরআইআইআই ব্যবহার করতে পারবেন না?

না সত্যিই না.

আপনি কি কখনও নিজেকে আবর্জনা সংগ্রহের জন্য আগ্রহী দেখতে পান? কমপক্ষে কোনও আবর্জনা সংগ্রাহক অন্যকে পরিচালনা করার সময় আপনি কিছু বস্তুর জন্য ব্যবহার করতে পারেন?

কখনও। আবর্জনা সংগ্রহ কেবল গতিশীল সংস্থান পরিচালনার খুব ছোট উপসেটটি সমাধান করে।


আমি জাভা এবং সি # খুব অল্প ব্যবহার করেছি, তাই আমার এটি কখনই মিস হয়নি, তবে জিসি অবশ্যই আমার স্টাইলটি জটিলতায় ফেলেছিল যখন যখন সেগুলি ব্যবহার করার দরকার ছিল রিসোর্স ম্যানেজমেন্টের ক্ষেত্রে, কারণ আমি আরআইআই ব্যবহার করতে পারিনি।
রব কে

1
আমি সি # প্রচুর ব্যবহার করেছি এবং আপনার সাথে 100% একমত হয়েছি। প্রকৃতপক্ষে, আমি একটি অ-নিরপেক্ষ জিসিকে কোনও ভাষার দায় হিসাবে বিবেচনা করি।
নেমানজা ত্রিফুনোভিচ

2

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


1
না, তারা না। তবে গাদাটিতে কোনও স্মার্ট পয়েন্টার তৈরি করার জন্য আপনার কি কোনও যুক্তিসঙ্গত কারণ আছে? যাইহোক, স্মার্ট পয়েন্টারটি যেখানে RAII কার্যকর হতে পারে তার একটি উদাহরণ ছিল।
ই ডোমিনিক

1
হতে পারে আমার "স্ট্যাক" বনাম "হিপ" এর ব্যবহারটি কিছুটা opালু - "স্ট্যাক" -র কোনও বস্তুর দ্বারা আমি কোনও স্থানীয় বস্তু বোঝাই। এটি প্রাকৃতিকভাবে কোনও বস্তুর একটি অংশ হতে পারে যেমন theগালে। "স্তূপে একটি স্মার্ট পয়েন্টার তৈরি করুন" দ্বারা, আমি স্মার্ট পয়েন্টারে নিজেই নতুন / মুছে ফেলার কথা বলতে চাইছি।
ই ডোমিনিক

1

আরএআইআই হ'ল রিসোর্স অ্যাকুইজিশন ইজ ইনিশিয়ালাইজের একটি সংক্ষিপ্ত রূপ।

কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর উভয়ের পক্ষে এবং প্রায়শই স্বয়ংক্রিয়ভাবে যে কনস্ট্রাক্টরের সাথে মিল রয়েছে যেগুলি আর্গুমেন্টে পাস হচ্ছে বা সবচেয়ে খারাপ ক্ষেত্রে ডিফল্ট কনস্ট্রাক্টরকে ড্যান্ডস্ট্রাক্টর বলা হয় যদি স্পষ্টতাকে অন্যথায় ডিফল্ট বলা হয় তবে এই কৌশলটি সি ++ এর পক্ষে অনেক বেশি অনন্য is সি ++ সংকলক দ্বারা যুক্ত করা হয় যদি আপনি কোনও সি ++ শ্রেণীর জন্য স্পষ্টভাবে কোনও ডেস্ট্রাক্টর না লিখে থাকেন তবে তাকে ডাকা হয়। এটি কেবলমাত্র স্বয়ংক্রিয়ভাবে পরিচালিত সি ++ অবজেক্টগুলির জন্য ঘটে - যার অর্থ হ'ল ফ্রি স্টোরটি ব্যবহার করা হচ্ছে না (নতুন, নতুন [] / মোছা, মুছে ফেলা [] সি ++ অপারেটরগুলি ব্যবহার করে মেমরি বরাদ্দ / বাতিল করা হয়)।

স্পষ্টভাবে নতুন / নতুন [] ব্যবহার করে আরও মেমরি চেয়ে জিজ্ঞাসা করে হিপ / ফ্রি-স্টোরে তৈরি হওয়া অবজেক্টগুলিকে হ্যান্ডেল করার জন্য আরএআইআই কৌশলটি স্বয়ংক্রিয়ভাবে পরিচালিত অবজেক্ট বৈশিষ্ট্যটি ব্যবহার করে, যা মুছুন / মুছুন কল করে স্পষ্টতই ধ্বংস করা উচিত [] । স্বয়ংক্রিয়ভাবে পরিচালিত অবজেক্টের শ্রেণি এটি হ্যাপ / ফ্রি-স্টোর মেমরিতে তৈরি হওয়া অন্য একটি অবজেক্টকে আবৃত করবে। সুতরাং স্বয়ংক্রিয়ভাবে পরিচালিত অবজেক্টের কনস্ট্রাক্টর চালিত হলে, মোড়কযুক্ত বস্তুটি হিপ / ফ্রি-স্টোর মেমরিতে তৈরি হয় এবং যখন স্বয়ংক্রিয়ভাবে পরিচালিত অবজেক্টের হাতল সুযোগের বাইরে চলে যায়, তখন স্বয়ংক্রিয়ভাবে পরিচালিত অবজেক্টের ডেস্ট্রাক্টরকে স্বয়ংক্রিয়ভাবে ডাকা হয় যার মধ্যে মোড়ানো ডিলিট ব্যবহার করে অবজেক্টটি নষ্ট হয়ে যায়। ওওপি ধারণাগুলির সাহায্যে, আপনি যদি অন্য শ্রেণীর ভিতরে এই জাতীয় জিনিসগুলি ব্যক্তিগত স্কোপে আবদ্ধ করেন, তবে মোড়ানো ক্লাসের সদস্য এবং পদ্ধতি এবং আপনার কাছে অ্যাক্সেস নেই & এই কারণেই স্মার্ট পয়েন্টার (ওরফে হ্যান্ডেল ক্লাস) ডিজাইন করা হয়েছে। এই স্মার্ট পয়েন্টারগুলি মোড়কযুক্ত বস্তুকে বাহ্যিক বিশ্বে এবং সেখানে যে কোনও সদস্য / পদ্ধতিতে উদ্ভাসিত মেমরির অবজেক্টটি তৈরির অনুরোধ জানানো হয় to নোট করুন যে স্মার্ট পয়েন্টারগুলির বিভিন্ন প্রয়োজনের ভিত্তিতে বিভিন্ন স্বাদ রয়েছে। এ সম্পর্কে আরও জানতে আপনার আন্দ্রেই আলেকজান্দ্রেস্কু দ্বারা আধুনিক সি ++ প্রোগ্রামিং পড়তে হবে বা লাইব্রেরির (www.boostorg) শেয়ারড_পট.আরপিপি বাস্তবায়ন / ডকুমেন্টেশনগুলি উল্লেখ করা উচিত। আশা করি এটি আপনাকে আরআইআইআই বুঝতে সহায়তা করবে। এ সম্পর্কে আরও জানতে আপনার আন্দ্রেই আলেকজান্দ্রেস্কু দ্বারা আধুনিক সি ++ প্রোগ্রামিং পড়তে হবে বা লাইব্রেরির (www.boostorg) শেয়ারড_পট.আরপিপি বাস্তবায়ন / ডকুমেন্টেশনগুলি উল্লেখ করা উচিত। আশা করি এটি আপনাকে আরআইআইআই বুঝতে সহায়তা করবে। এ সম্পর্কে আরও জানতে আপনার আন্দ্রেই আলেকজান্দ্রেস্কু দ্বারা আধুনিক সি ++ প্রোগ্রামিং পড়তে হবে বা লাইব্রেরির (www.boostorg) শেয়ারড_পট.আরপিপি বাস্তবায়ন / ডকুমেন্টেশনগুলি উল্লেখ করা উচিত। আশা করি এটি আপনাকে আরআইআইআই বুঝতে সহায়তা করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.