C ++ shared_ptr

C Shared_ptr



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

উদাহরণ 1: বিভিন্ন উপায়ে শেয়ার্ড পয়েন্টার ঘোষণা করুন

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







// প্রয়োজনীয় লাইব্রেরি অন্তর্ভুক্ত করুন

#অন্তর্ভুক্ত

#অন্তর্ভুক্ত

namespacestd ব্যবহার করে;

// শ্রেণী নির্ধারণ করুন
ক্লাসমাইক্লাস{
জনসাধারণ:
// নির্মাতা ঘোষণা করুন
আমার ক্লাস() {
খরচ<<'কন্সট্রাকটর বলা হয়।n';
}
// টেক্সট প্রিন্ট করার একটি পদ্ধতি ঘোষণা করুন
অকার্যকর প্রদর্শন(স্ট্রিং str)
{
খরচ<<'প্রদর্শন () পদ্ধতি থেকে বলা হয়'<<পৃ<<'নির্দেশক।n';
}
};

অন্তর্মুখী()
{
// কন্সট্রাকটরকে কল না করে shared_ptr আরম্ভ করুন
shared_ptr p1=make_shared();
p1->প্রদর্শন('প্রথম');
// কন্সট্রাকটর কল করে shared_ptr আরম্ভ করুন
shared_ptr p2=shared_ptr(newMyClass);
p2->প্রদর্শন('দ্বিতীয়');

// অ্যাসাইনমেন্ট দ্বারা shared_ptr আরম্ভ করুন
shared_ptr p3=p1;
p3->প্রদর্শন('তৃতীয়');
রিটার্ন 0;
}

আউটপুট:



উপরের কোডটি কার্যকর করার পর নিম্নলিখিত আউটপুটটি প্রদর্শিত হবে। কনস্ট্রাক্টর শুধুমাত্র দ্বিতীয় বস্তু সৃষ্টির সময় ডেকেছে। সুতরাং, নির্মাতার বার্তাটি কেবল একবারই মুদ্রিত হয়েছে:







উদাহরণ 2: সঞ্চিত শেয়ার্ড পয়েন্টার লোকেশন প্রিন্ট করুন

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

// প্রয়োজনীয় লাইব্রেরি অন্তর্ভুক্ত করুন

#অন্তর্ভুক্ত

#অন্তর্ভুক্ত

namespacestd ব্যবহার করে;

// শ্রেণী নির্ধারণ করুন
ক্লাসমাইক্লাস
{
জনসাধারণ:
// নির্মাতা ঘোষণা করুন
আমার ক্লাস() {
খরচ<<'কন্সট্রাকটর বলা হয়।n';
}
};
// পয়েন্টার আরম্ভ করার জন্য ফাংশন সংজ্ঞায়িত করুন
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
খরচ<<p2।পাওয়া() <<'n';
}

অন্তর্মুখী()
{
// কন্সট্রাকটর কল করে shared_ptr আরম্ভ করুন
shared_ptr p1=shared_ptr(newMyClass);
খরচ<<p1।পাওয়া() <<'n';

// ফাংশন কল করে shared_ptr আরম্ভ করুন
Init_shared_ptr();

// অ্যাসাইনমেন্ট দ্বারা shared_ptr আরম্ভ করুন
shared_ptr p3=p1;
খরচ<<p3।পাওয়া() <<'n';
রিটার্ন 0;
}

আউটপুট:



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

উদাহরণ 3: ভাগ করা পয়েন্টার বস্তু গণনা করুন

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

// প্রয়োজনীয় লাইব্রেরি অন্তর্ভুক্ত করুন

#অন্তর্ভুক্ত

#অন্তর্ভুক্ত

namespacestd ব্যবহার করে;
// শ্রেণী নির্ধারণ করুন
ক্লাসমাইক্লাস{
জনসাধারণ:
// নির্মাতা ঘোষণা করুন
আমার ক্লাস() {
খরচ<<'কন্সট্রাকটর বলা হয়।n';
}
};
অন্তর্মুখী()
{
// কনস্ট্রাক্টরকে কল করে প্রথম shared_ptr আরম্ভ করুন
shared_ptr p1(newMyClass);

// প্রথম পয়েন্টার দ্বারা shared_ptr বস্তুর সংখ্যা প্রদর্শন করুন
খরচ<<'p1 নির্দেশ করে'<<p1।use_count() <<বস্তু (গুলি)।n';
// প্রথম shared_ptr ব্যবহার করে দ্বিতীয় shared_ptr আরম্ভ করুন
shared_ptr p2(p1);
// প্রথম এবং দ্বিতীয় পয়েন্টার দ্বারা shared_ptr বস্তুর সংখ্যা প্রদর্শন করুন
খরচ<<'p2 নির্দেশ করে'<<p2।use_count() <<বস্তু (গুলি)।n';
খরচ<<'p1 নির্দেশ করে'<<p1।use_count() <<বস্তু (গুলি)।n';
// shared_ptr অবজেক্ট থেকে প্রথম পয়েন্টার এর মালিকানা সরান
p1।রিসেট();
// দ্বিতীয় পয়েন্টার দ্বারা shared_ptr বস্তুর সংখ্যা প্রদর্শন করুন
খরচ<<'p2 নির্দেশ করে'<<p2।use_count() <<বস্তু (গুলি)।n';
রিটার্ন 0;
}

আউটপুট:

উপরের কোডটি কার্যকর করার পর নিম্নলিখিত আউটপুটটি প্রদর্শিত হবে। প্রথম নির্দেশক, p1 , সৃষ্টির পর একটি বস্তুর দিকে নির্দেশ করছে। দ্বিতীয় পয়েন্টার তৈরির পর, p2 , প্রথম পয়েন্টার ব্যবহার করে, p1 , উভয় পয়েন্টার পয়েন্টার শেয়ার করার জন্য দুটি বস্তুর দিকে নির্দেশ করছে। পয়েন্টার জন্য reset () ফাংশন কল করার পর, p1 , একটি বস্তু ধ্বংস করা হয়েছে, এবং নির্দেশক, p2 , এখন শুধুমাত্র একটি বস্তুর দিকে নির্দেশ করছে।

উপসংহার:

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