কি হচ্ছে
আপনি যখন লিখবেন T t;
আপনি স্বয়ংক্রিয় স্টোরেজ সময়কালT
সহ ধরণের একটি অবজেক্ট তৈরি করছেন । সুযোগের বাইরে গেলে এটি স্বয়ংক্রিয়ভাবে পরিষ্কার হয়ে যাবে।
আপনি যখন লিখবেন new T()
আপনি গতিশীল স্টোরেজ সময়কালT
সহ ধরণের একটি অবজেক্ট তৈরি করছেন । এটি স্বয়ংক্রিয়ভাবে পরিষ্কার হবে না।
এটি delete
পরিষ্কার করার জন্য আপনাকে এটিতে একটি পয়েন্টার দিতে হবে :
যাইহোক, আপনার দ্বিতীয় উদাহরণটি আরও খারাপ: আপনি পয়েন্টারটিকে অবহেলা করছেন এবং অবজেক্টের একটি অনুলিপি করছেন। এভাবে আপনি তৈরি করা অবজেক্টটির পয়েন্টারটি হারাবেন new
, তাই আপনি চাইলেও কখনও এটি মুছতে পারবেন না!
আপনার কি করা উচিত
আপনার স্বয়ংক্রিয় স্টোরেজ সময়কাল পছন্দ করা উচিত। একটি নতুন অবজেক্ট দরকার, কেবল লিখুন:
A a; // a new object of type A
B b; // a new object of type B
আপনার যদি ডায়নামিক স্টোরেজ সময়কাল প্রয়োজন হয় তবে একটি স্বয়ংক্রিয় স্টোরেজ সময়কাল অবজেক্টে বরাদ্দ হওয়া অবজেক্টে পয়েন্টারটি সংরক্ষণ করুন যা এটি স্বয়ংক্রিয়ভাবে মোছা হয়।
template <typename T>
class automatic_pointer {
public:
automatic_pointer(T* pointer) : pointer(pointer) {}
// destructor: gets called upon cleanup
// in this case, we want to use delete
~automatic_pointer() { delete pointer; }
// emulate pointers!
// with this we can write *p
T& operator*() const { return *pointer; }
// and with this we can write p->f()
T* operator->() const { return pointer; }
private:
T* pointer;
// for this example, I'll just forbid copies
// a smarter class could deal with this some other way
automatic_pointer(automatic_pointer const&);
automatic_pointer& operator=(automatic_pointer const&);
};
automatic_pointer<A> a(new A()); // acts like a pointer, but deletes automatically
automatic_pointer<B> b(new B()); // acts like a pointer, but deletes automatically
এটি একটি সাধারণ প্রথা যা খুব বর্ণনামূলক নাম আরআইআইআই ( রিসোর্স অ্যাকুইজিশন ইজ ইনিশিয়ালাইজেশন ) দ্বারা যায় goes আপনি যখন কোনও এমন কোনও উত্স অর্জন করেন যা ক্লিনআপের প্রয়োজন হয়, আপনি এটিকে স্বয়ংক্রিয় স্টোরেজ সময়কালের একটি বস্তুতে আটকে থাকেন যাতে আপনার এটি পরিষ্কার করার বিষয়ে চিন্তা করার দরকার নেই। এটি যেকোন সংস্থানেই প্রযোজ্য, তা মেমরি হোক, ফাইল খুলুন, নেটওয়ার্ক সংযোগ করুন বা যা আপনি পছন্দ করেন।
এই automatic_pointer
জিনিসটি ইতিমধ্যে বিভিন্ন রূপে বিদ্যমান, আমি একটি উদাহরণ দেওয়ার জন্য এটি সরবরাহ করেছি। নামক স্ট্যান্ডার্ড লাইব্রেরিতে একটি খুব অনুরূপ শ্রেণীর উপস্থিত রয়েছে std::unique_ptr
।
এখানে একটি পুরানো নাম (প্রাক-সি ++ 11) রয়েছে auto_ptr
তবে এটি এখন অবচয় করা হয়েছে কারণ এটির একটি অদ্ভুত অনুলিপি আচরণ রয়েছে।
এবং তারপরে আরও কিছু স্মার্ট উদাহরণ রয়েছে, যেমন std::shared_ptr
, যা একই বস্তুতে একাধিক পয়েন্টারকে অনুমতি দেয় এবং শেষ পয়েন্টারটি ধ্বংস হয়ে গেলে কেবল এটি পরিষ্কার করে।