উন্নত মেয়াদের অভাবে বর্জন যে পৃথিবীতে বাস করেন তা হ'ল ... একাডেমিক। যদি আপনার কোডটি এমনভাবে ডিজাইন ও কাঠামোযুক্ত করা যায় যে অবজেক্টগুলিতে খুব ইচ্ছাকৃতভাবে সম্পর্কিত সম্পর্কিত শ্রেণিবিন্যাস রয়েছে, যেমন মালিকানার সম্পর্কগুলি কঠোর এবং অবারিত হয়, কোড এক দিকে প্রবাহিত হয় (উচ্চ-স্তর থেকে নিম্ন-স্তরে) এবং অবজেক্টগুলি কেবল নিম্নের সাথে কথা বলে অনুক্রমের, তাহলে আপনি অনেক প্রয়োজন পাবে না shared_ptr
। এটি এমন কিছু যা আপনি বিরল ইভেন্টগুলিতে ব্যবহার করেন যেখানে কাউকে নিয়ম ভঙ্গ করতে হয়। তবে অন্যথায়, আপনি কেবলমাত্র vector
s বা অন্যান্য ডেটা স্ট্রাকচারের সমস্ত কিছুকে স্ট্যান্ড করতে পারেন যা মান শব্দার্থক ব্যবহার করে, এবং যেগুলি unique_ptr
আপনাকে এককভাবে বরাদ্দ করতে হবে তার জন্য।
যদিও এটি বেঁচে থাকার জন্য দুর্দান্ত একটি পৃথিবী, আপনি সমস্ত সময় যা করতে পান তা তা নয়। আপনি যদি নিজের কোডটি সেভাবে সংগঠিত করতে না পারেন , কারণ আপনি যে সিস্টেমটি তৈরির চেষ্টা করছেন তার নকশাটির অর্থ এটি অসম্ভব (বা কেবল গভীরভাবে অপ্রীতিকর), তবে আপনি নিজেকে আরও বেশি করে অবজেক্টের ভাগ করে নেওয়া প্রয়োজন বলে মনে করছেন ।
এই জাতীয় সিস্টেমে নগ্ন পয়েন্টার ধরে রাখা ... ঠিক বিপজ্জনক নয়, তবে এটি প্রশ্ন উত্থাপন করে। দুর্দান্ত জিনিসটি shared_ptr
হ'ল এটি বস্তুর আজীবন সম্পর্কে যুক্তিসঙ্গত গ্যারান্টি সরবরাহ করে। এটা কি ভাঙ্গা যায়? অবশ্যই. কিন্তু মানুষ const_cast
জিনিসগুলিও করতে পারে; বুনিয়াদি যত্ন এবং খাওয়ানো হ'ল shared_ptr
বরাদ্দ করা সামগ্রীর মালিকানা অবশ্যই ভাগ করে নেওয়া উচিত for
তারপরে, এর রয়েছে weak_ptr
যা এ এর অনুপস্থিতিতে ব্যবহার করা যাবে না shared_ptr
। যদি আপনার সিস্টেমটি দৃid়ভাবে কাঠামোগত হয় তবে আপনি কোনও বস্তুর কাছে নগ্ন পয়েন্টার সঞ্চয় করতে পারেন, এই জ্ঞানের মধ্যে নিরাপদ যে অ্যাপ্লিকেশনটির কাঠামোটি নিশ্চিত করে যে অবজেক্টটি আপনাকে নির্দেশিত করে তুলবে। আপনি এমন কোনও ফাংশন কল করতে পারেন যা কিছু অভ্যন্তরীণ বা বাহ্যিক মানকে নির্দেশককে ফেরত দেয় (উদাহরণস্বরূপ এক্স নামের বস্তুটি সন্ধান করুন)। সঠিকভাবে কাঠামোগত কোডে, সেই ফাংশনটি কেবল তখনই আপনার কাছে উপলব্ধ যদি অবজেক্টের জীবদ্দশায় আপনার নিজের ছাড়িয়ে যাওয়ার নিশ্চয়তা দেওয়া হয়; সুতরাং, আপনার অবজেক্টে সেই নগ্ন পয়েন্টারটি সংরক্ষণ করা ভাল।
যেহেতু সত্যিকারের সিস্টেমে এই অনমনীয়তা অর্জন করা সবসময় সম্ভব নয়, তাই আপনার আজীবন নিশ্চিত করার জন্য আপনার কিছু উপায় প্রয়োজন । কখনও কখনও, আপনার সম্পূর্ণ মালিকানার প্রয়োজন হয় না; কখনও কখনও, আপনাকে কেবল পয়েন্টারটি কখন খারাপ বা ভাল তা জানার দরকার হয়। এটিই সেখানে weak_ptr
আসে There এমন ঘটনাও ঘটেছে যেখানে আমি একটি ব্যবহার করতে পারি unique_ptr
বা boost::scoped_ptr
করতে পারি, তবে আমাকে একটি ব্যবহার করতে হয়েছিল shared_ptr
কারণ আমার বিশেষত কাউকে "অস্থির" পয়েন্টার দেওয়ার দরকার ছিল। একজন পয়েন্টার যাঁর আজীবন অনির্দিষ্ট ছিল এবং তারা যখন জিজ্ঞাসা করতে পারে যে কখন সেই পয়েন্টারটি ধ্বংস হয়েছিল।
বিশ্বের অবস্থা যখন নির্বিঘ্ন থাকে তখন বেঁচে থাকার নিরাপদ উপায়।
এটি কি পয়েন্টারটি পাওয়ার জন্য, কোনও ফাংশন কল দিয়েই করা যেত না weak_ptr
? হ্যাঁ, তবে এটি আরও সহজেই ভেঙে যেতে পারে। কোনও ফাংশন যিনি নগ্ন পয়েন্টারটি ফেরত দেয় তার সিনথেটিকভাবে পরামর্শ দেওয়ার কোনও উপায় নেই যে ব্যবহারকারী দীর্ঘকালীন সময়ে এই পয়েন্টারটিকে স্টোরের মতো কিছু না করে। কোনওটি ফিরিয়ে দেওয়া shared_ptr
কারও পক্ষে সহজেই এটি সঞ্চয় করা এবং কোনও সামগ্রীর আয়ু বৃদ্ধি করতে পারে। weak_ptr
তবে ফিরে আসা দৃ strongly়ভাবে পরামর্শ দেয় যে shared_ptr
আপনি যেটি পেয়েছেন তা সংরক্ষণ lock
করা ... সন্দেহজনক ধারণা। এটি আপনাকে এটি করা থেকে বিরত করবে না, তবে সি ++ এর কোনও কিছুই আপনাকে ব্রেকিং কোড থেকে বিরত রাখবে না। weak_ptr
প্রাকৃতিক জিনিসটি করা থেকে কিছুটা ন্যূনতম প্রতিরোধ সরবরাহ করে।
এখন, অর্থাৎ যে না shared_ptr
হতে পারে না overused ; এটা অবশ্যই পারে। বিশেষত unique_ptr
পূর্ববর্তী, অনেকগুলি ক্ষেত্রেই আমি কেবলমাত্র ব্যবহার boost::shared_ptr
করেছি কারণ আমার চারপাশে একটি আরআইআই পয়েন্টারটি পাস করার বা এটি একটি তালিকায় রাখা দরকার ছিল। পদক্ষেপ শব্দার্থবিদ্যা ছাড়া এবং unique_ptr
, boost::shared_ptr
শুধুমাত্র বাস্তব সমাধান ছিল।
এবং আপনি এটি এমন জায়গায় ব্যবহার করতে পারেন যেখানে এটি বেশ অপ্রয়োজনীয়। উপরে বর্ণিত হিসাবে, সঠিক কোড কাঠামো কিছু ব্যবহারের প্রয়োজনকে দূর করতে পারে shared_ptr
। তবে যদি আপনার সিস্টেমটি যেমন কাঠামোগত না করা যায় এবং এখনও এটির যা করা প্রয়োজন তা করে থাকেন তবে তা shared_ptr
কার্যকরভাবে কাজে লাগবে।