এটি একটি পুরানো, উত্তর, প্রশ্ন, কিন্তু @ অ্যালেক্সানড্রে "কেউ কেন এটি করতে চাইবে?" জিজ্ঞাসা করেছিল এবং আমি ভেবেছিলাম যে আমি এই বিকেলে বিবেচনা করছি এমন একটি উদাহরণ ব্যবহার করতে পারি।
উত্তরাধিকার কোড. নগ্ন পয়েন্টারগুলি ব্যবহার করুন ওজেজ * শেষের দিকে মুছে ফেলার সাথে আপত্তি করুন।
দুর্ভাগ্যক্রমে আমার মাঝে মাঝে প্রয়োজন, প্রায়শই নয়, অবজেক্টটি দীর্ঘায়িত করার জন্য।
আমি এটিকে একটি উল্লেখযোগ্য স্মার্ট পয়েন্টার হিসাবে বিবেচনা করছি making তবে পরিবর্তন করার জন্য প্রচুর কোড থাকবে, যদি আমি ref_cnt_ptr<Obj>
সর্বত্র ব্যবহার করি । এবং যদি আপনি উলঙ্গ ওবজ * এবং রেফ_সিএনটি_পিটার মিশ্রিত করেন তবে সর্বশেষ রেফ_সিএনটি_পিটার চলে গেলে আপনি অবজেক্টটি স্পষ্টভাবে মুছে ফেলতে পারবেন, যদিও ওবজ * এখনও জীবিত রয়েছে।
সুতরাং আমি একটি সুস্পষ্ট_প্রেম_আরফ_সিএনটি_পিটি তৈরির বিষয়ে ভাবছি। যেমন একটি রেফারেন্স গণনা করা পয়েন্টার যেখানে মুছে ফেলা কেবল একটি সুস্পষ্ট মোছার রুটিনে করা হয়। এটি এমন এক জায়গায় ব্যবহার করা যেখানে বিদ্যমান কোডটি অবজেক্টের আজীবন জানে এবং সেই সাথে আমার নতুন কোডে যা অবজেক্টটিকে দীর্ঘকাল ধরে রাখে।
সুস্পষ্ট_ডিলিটি_রেফ_সিএনটি_সিপি হিসাবে রেফারেন্স গণনাটি বাড়ানো এবং হ্রাস করা হেরফের হয়।
যখন রেফারেন্স গণনাটি সুস্পষ্ট_দেহী_আরফ_সিএনটি_সিপি ডেস্ট্রাক্টরে শূন্য হতে দেখা যায় তখন মুক্ত হয় না।
স্পষ্টভাবে মুছার মতো ক্রিয়াকলাপে যখন রেফারেন্স গণনাটি শূন্য হিসাবে দেখা হয় কেবল তখনই মুক্ত হয়। যেমন কিছুতে:
template<typename T> class explicit_delete_ref_cnt_ptr {
private:
T* ptr;
int rc;
...
public:
void delete_if_rc0() {
if( this->ptr ) {
this->rc--;
if( this->rc == 0 ) {
delete this->ptr;
}
this->ptr = 0;
}
}
};
ঠিক আছে, এরকম কিছু। কোনও রেফারেন্স গণনা করা পয়েন্টার প্রকারটি আরসি'ড পিটিআর ডিস্ট্রাক্টরটিতে নির্দেশিত বস্তুটি স্বয়ংক্রিয়ভাবে মোছা না হওয়া কিছুটা অস্বাভাবিক। তবে দেখে মনে হচ্ছে এটি নগ্ন পয়েন্টার এবং আরসি'ড পয়েন্টারগুলিকে কিছুটা নিরাপদ করতে পারে।
তবে এখনও পর্যন্ত এটি মুছার প্রয়োজন নেই।
তবে আমার কাছে এটি ঘটেছিল: যদি বস্তুটি নির্দেশ করে, পয়েন্টটিওয়ালা, জানে যে এটি রেফারেন্স গণনা করা হচ্ছে, উদাহরণস্বরূপ যদি গণনাটি বস্তুর অভ্যন্তরে থাকে (বা অন্য কোনও টেবিলে) থাকে, তবে রুটিন মুছে ফেলা_আইফ_সিআরসি পদ্ধতিটি হতে পারে পয়েন্টি অবজেক্ট, (স্মার্ট) পয়েন্টার নয়।
class Pointee {
private:
int rc;
...
public:
void delete_if_rc0() {
this->rc--;
if( this->rc == 0 ) {
delete this;
}
}
}
};
আসলে, এটি মোটেও সদস্য পদ্ধতি হওয়ার দরকার নেই, তবে এটি একটি ফাংশন হতে পারে:
map<void*,int> keepalive_map;
template<typename T>
void delete_if_rc0(T*ptr) {
void* tptr = (void*)ptr;
if( keepalive_map[tptr] == 1 ) {
delete ptr;
}
};
(বিটিডাব্লু, আমি জানি কোডটি খুব একটা সঠিক নয় - আমি যদি সমস্ত বিবরণ যুক্ত করি তবে এটি কম পঠনযোগ্য হয়ে যায়, তাই আমি এটিকে এভাবেই রেখে যাচ্ছি))
delete this
যদি শ্রেণীর অবজেক্ট তৈরির জন্য ক্লাস এবং বরাদ্দ পদ্ধতির মধ্যে একটি শক্ত সংযোগ তৈরি করেন। এটি অত্যন্ত ওও নকশা, কারণ ওওপি-র সবচেয়ে মৌলিক বিষয় হ'ল স্বায়ত্তশাসিত শ্রেণি তৈরি করা যা তাদের কলকারী কী করছে তা জানে না বা যত্ন করে না। সুতরাং একটি সঠিকভাবে ডিজাইন করা শ্রেণীর এটি কীভাবে বরাদ্দ দেওয়া হয়েছিল তা সম্পর্কে জানা বা যত্ন নেওয়া উচিত নয়। আপনার যদি কোনও কারণে যদি এই জাতীয় উদ্ভাবনী ব্যবস্থার প্রয়োজন হয় তবে আমি মনে করি যে আরও ভাল নকশা হ'ল আসল শ্রেণীর চারপাশে একটি র্যাপার ক্লাস ব্যবহার করা এবং র্যাপারটি বরাদ্দের সাথে চুক্তি করা উচিত।