কোন সি ++ স্মার্ট পয়েন্টার বাস্তবায়ন উপলব্ধ?


121

তুলনা, পেশাদার, কনস এবং কখন ব্যবহার করবেন?

এটি কোনও আবর্জনা সংগ্রহের থ্রেড থেকে স্পিন-অফ যেখানে আমি যা মনে করি একটি সহজ উত্তর কিছু নির্দিষ্ট স্মার্ট পয়েন্টার বাস্তবায়ন সম্পর্কে প্রচুর মন্তব্য তৈরি করেছিল যাতে এটি একটি নতুন পোস্ট শুরু করার মতো বলে মনে হয়।

শেষ পর্যন্ত প্রশ্নটি হ'ল সি ++ এ স্মার্ট পয়েন্টারগুলির বিভিন্ন বাস্তবায়ন কী কী এবং তারা কীভাবে তুলনা করতে পারে? আপনার পক্ষে অন্যথায় কাজ করা উচিত বলে মনে করতে পারে এমন কিছু সহজ সরল কৌশল এবং ব্যতিক্রম এবং গ্যাটাচস।

আমি এমন কিছু বাস্তবায়ন পোস্ট করেছি যা আমি ব্যবহার করেছি বা কমপক্ষে glossed করেছি এবং নীচে একটি উত্তর হিসাবে ব্যবহার করে বিবেচনা করেছি এবং তাদের পার্থক্য ও মিলগুলি সম্পর্কে আমার উপলব্ধি যা সঠিকভাবে 100% সঠিক না হতে পারে তাই নির্দ্বিধায় নির্দ্বিধায় চেক বা প্রয়োজন হিসাবে আমাকে সংশোধন করতে পারে।

লক্ষ্যটি হ'ল কিছু নতুন অবজেক্ট এবং লাইব্রেরি সম্পর্কে জানার বা আমার ব্যবহার এবং ইতিমধ্যে বহুল ব্যবহৃত প্রচলিত প্রয়োগসমূহের বোঝার সংশোধন করা এবং অন্যের জন্য শালীন রেফারেন্স সহ শেষ করা।


5
আমি মনে করি এটি এই প্রশ্নের উত্তর হিসাবে পুনরায় পোস্ট করা উচিত, এবং প্রশ্নটি একটি আসল প্রশ্নে পরিণত হয়েছিল। অন্যথায়, আমি বোধ করি লোকেরা এটিকে "আসল প্রশ্ন নয়" হিসাবে বন্ধ করবে।
স্ট্র্যাজার

3
অন্যান্য ধরণের স্মার্ট পয়েন্টার রয়েছে, যেমন এটিএল স্মার্ট পয়েন্টার বা ওপেনসিনিগ্রাফেরosg::ref_ptr
জেমস ম্যাকনেলিস

11
এখানে কি কোন প্রশ্ন আছে?
কোডি গ্রে

6
আমি মনে করি আপনি ভুল বুঝেছেন std::auto_ptrstd::auto_ptr_refএর নকশা বিশদ std::auto_ptrstd::auto_ptrআবর্জনা সংগ্রহের সাথে কোনও সম্পর্ক নেই, এর মূল উদ্দেশ্যটি বিশেষত ফাংশন কল এবং ফাংশন রিটার্ন পরিস্থিতিতে ব্যতিক্রমী নিরাপদ মালিকানার স্থানান্তরকে অনুমতি দেওয়া। std::unique_ptrআপনি কেবলমাত্র "সমস্যাগুলি" সমাধান করতে পারেন যা আপনি স্ট্যান্ডার্ড কনটেইনারগুলির সাথে উদ্ধৃত করেছেন কারণ সি ++ পরিবর্তন এবং অনুলিপিটির মধ্যে পার্থক্যের অনুমতি দেওয়ার জন্য পরিবর্তিত হয়েছে এবং স্ট্যান্ডার্ড পাত্রে এটির সুবিধা নিতে পরিবর্তিত হয়েছে।
সিবি বেইলি

3
আপনি বলেছিলেন যে আপনি স্মার্ট পয়েন্টারগুলিতে বিশেষজ্ঞ নন তবে আপনার সারসংক্ষেপটি বেশ বিস্তৃত এবং সঠিক ( auto_ptr_refবাস্তবায়নের বিশদ হওয়া সম্পর্কে ছোটখাটো কাঁটা ছাড়া )। তবুও, আমি সম্মত হই যে আপনার উত্তর হিসাবে এটি পোস্ট করা উচিত এবং প্রশ্নটিকে একটি আসল প্রশ্ন হিসাবে সংস্কার করুন। এটি তখন ভবিষ্যতের রেফারেন্স হিসাবে পরিবেশন করতে পারে।
কনরাড রুডল্ফ

উত্তর:


231

সি ++ 03

std::auto_ptr- সম্ভবত প্রথম ড্রাফট সিন্ড্রোমে আক্রান্ত মূলগুলির মধ্যে একটিটি কেবলমাত্র সীমিত আবর্জনা সংগ্রহের সুবিধা সরবরাহ করে। প্রথম খারাপ দিকটি এটি deleteবিনাশকে অ্যারে বরাদ্দকৃত বস্তু ( new[]) রাখার জন্য অগ্রহণযোগ্য করে তোলে । এটি পয়েন্টারের মালিকানা গ্রহণ করে তাই দুটি স্বয়ংক্রিয় পয়েন্টারে একই অবজেক্টটি থাকা উচিত নয়। অ্যাসাইনমেন্ট মালিকানা হস্তান্তর করবে এবং মূল্যকে অটো পয়েন্টারকে নাল পয়েন্টারে পুনরায় সেট করবে । যা সম্ভবত সবচেয়ে খারাপ ব্যর্থতার দিকে নিয়ে যায়; পূর্ববর্তী বর্ণিত অনুলিপি অনুলিপণের কারণে এগুলি এসটিএল পাত্রে ব্যবহার করা যাবে না। যে কোনও ব্যবহারের ক্ষেত্রে চূড়ান্ত আঘাত হ'ল তারা সি ++ এর পরবর্তী স্ট্যান্ডার্ডে অবনমিত হবে।

std::auto_ptr_ref- এটি কোনও স্মার্ট পয়েন্টার নয় এটি আসলে কোনও নকশার বিশদ যা std::auto_ptrনির্দিষ্ট পরিস্থিতিতে নকল এবং অ্যাসাইনমেন্টের অনুমতি হিসাবে ব্যবহার করা হয় allow বিশেষ করে এটি একটি অ-const রূপান্তর করতে ব্যবহার করা যেতে পারে std::auto_ptrএকটি থেকে lvalue Colvin-গিবনস কৌতুক নামেও পরিচিত ব্যবহার পদক্ষেপ কন্সট্রাকটর মালিকানা হস্তান্তর করতে।

বিপরীতে সম্ভবত std::auto_ptrস্বয়ংক্রিয়ভাবে আবর্জনা সংগ্রহের জন্য সাধারণ উদ্দেশ্যে স্মার্ট পয়েন্টার হিসাবে ব্যবহার করার উদ্দেশ্য ছিল না। আমার বেশিরভাগ সীমাবদ্ধ বোঝাপড়া এবং অনুমানগুলি হার্ব সটারের অটো_সিপিটারের কার্যকর ব্যবহারের উপর ভিত্তি করে এবং আমি এটি নিয়মিত ব্যবহার করি যদিও সর্বদা সবচেয়ে অনুকূলিত উপায়ে হয় না।


সি ++ 11

std::unique_ptr- এটি আমাদের বন্ধু যিনি std::auto_ptrএটির প্রতিস্থাপন করবেন এটির সাথে std::auto_ptrকাজ করা, বেসরকারী অনুলিপি নির্মাণকারীর মাধ্যমে মূল্য সুরক্ষা, এসটিএল কনটেইনার এবং অ্যালগরিদম ইত্যাদির সাথে ব্যবহারযোগ্য হয়ে ওঠার মতো দুর্বলতাগুলি সংশোধন করার জন্য মূল উন্নতি ছাড়া কিছুটা একই রকম হবে Since এবং মেমরির পদচিহ্নগুলি সীমাবদ্ধ যা প্রতিস্থাপনের জন্য এটি আদর্শ প্রার্থী, বা সম্ভবত আরও সঠিকভাবে নিজস্ব, কাঁচা পয়েন্টার হিসাবে বর্ণিত। "অনন্য" দ্বারা বোঝা যাচ্ছে যে পয়েন্টারের কেবলমাত্র পূর্বের মত একই মালিক std::auto_ptr

std::shared_ptr- আমি বিশ্বাস করি এটি টিআর 1 এর ভিত্তিতে এবং এটি boost::shared_ptrএলিয়াসিং এবং পয়েন্টার গাণিতিককেও অন্তর্ভুক্ত করতে উন্নত। সংক্ষেপে এটি একটি গতিশীল বরাদ্দকৃত অবজেক্টের চারপাশে একটি রেফারেন্স গণনা করা স্মার্ট পয়েন্টারকে আবৃত করে। "ভাগ করা" হিসাবে বোঝানো হয়েছে যে পয়েন্টারটি একাধিক ভাগ ভাগের পয়েন্টারের মালিক হতে পারে যখন সর্বশেষ ভাগ করা পয়েন্টারের শেষ রেফারেন্স সুযোগের বাইরে চলে যায় তবে অবজেক্টটি যথাযথভাবে মুছে ফেলা হবে। এগুলি থ্রেডও নিরাপদ এবং বেশিরভাগ ক্ষেত্রে অসম্পূর্ণ প্রকারগুলি পরিচালনা করতে পারে। ডিফল্ট বরাদ্দকারী ব্যবহার করে একটি হ্যাপ বরাদ্দ দিয়ে std::make_sharedদক্ষতার std::shared_ptrসাথে একটি নির্মাণ করতে ব্যবহার করা যেতে পারে ।

std::weak_ptr- একইভাবে টিআর 1 এবং ভিত্তিক boost::weak_ptr। এটি একটি এর মালিকানাধীন কোনও অবজেক্টের একটি রেফারেন্স std::shared_ptrএবং তাই std::shared_ptrরেফারেন্সের গণনা শূন্যে নেমে গেলে অবজেক্টের মোছা বাধা দেয় না । কাঁচা পয়েন্টারে অ্যাক্সেস পাওয়ার জন্য আপনাকে প্রথমে std::shared_ptrকল করে অ্যাক্সেস করতে lockহবে যা std::shared_ptrমালিকানাধীন পয়েন্টারটির মেয়াদ শেষ হয়ে গেছে এবং ইতিমধ্যে ধ্বংস হয়ে গেলে খালি ফিরে আসবে । একাধিক স্মার্ট পয়েন্টার ব্যবহার করার সময় এটি অনির্দিষ্টকালের জন্য ঝুলন্ত রেফারেন্স গণনা এড়াতে প্রাথমিকভাবে কার্যকর।


প্রচার করা

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

boost::weak_ptr- std::weak_ptrএই বাস্তবায়নের উপর ভিত্তি করে অনেকের পূর্ববর্তী বর্ণনার মতো , এটি একটিতে কোনও স্ব-মালিকানা প্রসঙ্গে অনুমতি দেয় boost::shared_ptr। আপনি lock()"দৃ "়" ভাগ করা পয়েন্টারটি অ্যাক্সেস করতে আশ্চর্যরূপে কল করবেন না এবং এটি ইতিমধ্যে ধ্বংস হয়ে যেতে পারে বলে এটি বৈধ কিনা তা নিশ্চিত করার জন্য অবশ্যই পরীক্ষা করা উচিত। ভাগ করে নেওয়া পয়েন্টারটি ফিরে না এসে সঞ্চয় না করে নিশ্চিত হয়ে নিন এবং এটি সম্পন্ন করার সাথে সাথে এটিকে সুযোগের বাইরে চলে যেতে দিন অন্যথায় আপনি ঠিক আবার চক্র সংক্রান্ত রেফারেন্স সমস্যায় ফিরে এসেছেন যেখানে আপনার রেফারেন্স গণনাগুলি স্থির থাকবে এবং অবজেক্টগুলি বিনষ্ট হবে না।

boost::scoped_ptr- এটি সামান্য ওভারহেড সহ একটি সাধারণ স্মার্ট পয়েন্টার বর্গ যা সম্ভবত boost::shared_ptrব্যবহারযোগ্য তখন এর আরও ভাল পারফরম্যান্স বিকল্পের জন্য ডিজাইন করা । এটি std::auto_ptrবিশেষ করে তুলনীয় যে এটি কোনও এসটিএল ধারক হিসাবে উপাদান হিসাবে বা একই বস্তুর একাধিক পয়েন্টার সহ নিরাপদে ব্যবহার করা যায় না।

boost::intrusive_ptr- আমি এটি কখনও ব্যবহার করি নি তবে আমার বোঝার থেকে আপনার নিজের স্মার্ট পয়েন্টারটি সামঞ্জস্যপূর্ণ ক্লাস তৈরি করার সময় এটি ব্যবহার করার জন্য ডিজাইন করা হয়েছে। আপনার নিজের গণনাটি রেফারেন্সটি বাস্তবায়ন করতে হবে, আপনি যদি নিজের শ্রেণিটি জেনেরিক হতে চান তবে আপনাকে কয়েকটি পদ্ধতিও প্রয়োগ করতে হবে, তাছাড়া আপনার নিজের থ্রেড সুরক্ষাও প্রয়োগ করতে হবে। প্লাস সাইড এ সম্ভবত আপনি বাছাই এবং আপনি কতটা বা কত সামান্য "স্মার্টনেস" চান তা বেছে নেওয়ার সবচেয়ে কাস্টম পদ্ধতি দেয়। intrusive_ptrএটি আপনাকে সাধারণত shared_ptrপ্রতিটি বস্তুতে একটি একক apাল বন্টন করতে দেয় তার থেকে বেশি কার্যকর । (ধন্যবাদ আরভিদ)

boost::shared_array- এটি boost::shared_ptrঅ্যারেগুলির জন্য একটি । মূলত new [], operator[]এবং অবশ্যই delete []বেকড হয় This এটি এসটিএল পাত্রে ব্যবহার করা যেতে পারে এবং যতদূর আমি জানি সমস্ত কিছুই boost:shared_ptrকরে যদিও আপনি boost::weak_ptrএগুলি ব্যবহার করতে পারবেন না । আপনি বিকল্পভাবে boost::shared_ptr<std::vector<>>অনুরূপ কার্যকারিতা এবং boost::weak_ptrরেফারেন্সগুলির জন্য ব্যবহারের ক্ষমতা ফিরে পেতে একটি ব্যবহার করতে পারেন ।

boost::scoped_array- এটি boost::scoped_ptrঅ্যারেগুলির জন্য একটি । সঙ্গে boost::shared_arrayপ্রয়োজনীয় সকল অ্যারে ধার্মিকতা মধ্যে বেকড হয়। এই এক অ COPYABLE হয় এবং তাই STL পাত্রে ব্যবহার করা যাবে না। আপনি সম্ভবত এটি ব্যবহার করতে পারেন আপনি এটি ব্যবহার করতে চাইছেন এমন যে কোনও জায়গায় আমি পেয়েছি std::vector। আমি কখনই স্থির করিনি কোনটি আসলে দ্রুততর বা কম ওভারহেড রয়েছে তবে এই স্কোপড অ্যারেটি এসটিএল ভেক্টরের চেয়ে কম জড়িত বলে মনে হয়। আপনি যখন স্ট্যাকের বরাদ্দ রাখতে চান তার boost::arrayপরিবর্তে বিবেচনা করুন।


কিউটি

QPointer- কিউটি ৪.০ এ পরিচয় করিয়ে দেওয়া এটি একটি "দুর্বল" স্মার্ট পয়েন্টার যা কেবলমাত্র কাজ করে QObjectএবং উত্পন্ন ক্লাসগুলির সাথে কাজ করে , যা কিউটি ফ্রেমওয়ার্কে প্রায় সব কিছুই তাই এটি আসলে কোনও সীমাবদ্ধতা নয়। তবে সীমাবদ্ধতা রয়েছে যে এটি কোনও "শক্তিশালী" পয়েন্টার সরবরাহ করে না এবং যদিও আপনি অন্তর্নিহিত অবজেক্টটি বৈধ কিনা তা আপনি পরীক্ষা করতে পারেন তবে isNull()বিশেষত বহু-থ্রেডযুক্ত পরিবেশে এই চেকটি পাস করার পরে আপনার অবজেক্টটি ঠিক ধ্বংস হতে পারে। চতুর্থ লোকেরা এই অবমানিত বিবেচনা করে আমি বিশ্বাস করি।

QSharedDataPointer- এটি একটি "শক্তিশালী" স্মার্ট পয়েন্টারটি সম্ভবত boost::intrusive_ptrএটির সাথে তুলনাযোগ্য যদিও এটি থ্রেড সুরক্ষায় কিছু অন্তর্নির্মিত রয়েছে তবে আপনাকে রেফারেন্স গণনা পদ্ধতি ( refএবং deref) অন্তর্ভুক্ত করতে হবে যা আপনি সাবক্ল্যাসিং করে করতে পারেন QSharedData। বেশিরভাগ কিউইটির মতো অবজেক্টগুলি যথেষ্ট উত্তরাধিকার এবং সাবক্ল্যাসিংয়ের মাধ্যমে সর্বোত্তমভাবে ব্যবহৃত হয় বলে মনে হয় উদ্দিষ্ট নকশা।

QExplicitlySharedDataPointer- QSharedDataPointerএটি স্পষ্টভাবে কল দেয় না বাদে খুব অনুরূপ detach()QSharedDataPointerরেফারেন্স গণনা শূন্যের কমে যাওয়ার পরে ঠিক কখন আলাদা করতে হবে নিয়ন্ত্রণের ক্ষেত্রে এই সামান্য বৃদ্ধি হিসাবে আমি এই সংস্করণ ২.০ কে কল করব বিশেষত পুরো নতুন অবজেক্টের জন্য মূল্যহীন।

QSharedPointer- পারমাণবিক রেফারেন্স গণনা, থ্রেড নিরাপদ, ভাগযোগ্য পয়েন্টার, কাস্টম মোছা (অ্যারে সমর্থন), স্মার্ট পয়েন্টার হওয়া উচিত বলে মনে হচ্ছে। এটি আমি প্রাথমিকভাবে কিউটিতে একটি স্মার্ট পয়েন্টার হিসাবে ব্যবহার করি এবং আমি এটি তুলনামূলক দেখতে পাই boost:shared_ptrযদিও সম্ভবত Qt এর অনেকগুলি অবজেক্টের মতো উল্লেখযোগ্যভাবে বেশি ওভারহেড।

QWeakPointer- আপনি কি একটি reoccurring নিদর্শন বোঝেন? ঠিক একইভাবে std::weak_ptrএবং boost::weak_ptrএটি QSharedPointerযখন দুটি স্মার্ট পয়েন্টারগুলির মধ্যে আপনার রেফারেন্সের প্রয়োজন হয় তখন তা মিলিয়ে আপনার আইটেমগুলি কখনই মোছার কারণ হতে পারে না।

QScopedPointer- এই নামটিও পরিচিত দেখা উচিত এবং প্রকৃতপক্ষে boost::scoped_ptrভাগ করা এবং দুর্বল পয়েন্টারগুলির কিউটি সংস্করণগুলির বিপরীতে। এটি ওভারহেড ছাড়াই একটি একক মালিককে স্মার্ট পয়েন্টার সরবরাহ করতে কাজ করে QSharedPointerযা এটি সামঞ্জস্যতা, ব্যতিক্রম নিরাপদ কোড এবং আপনি ব্যবহার করতে পারেন std::auto_ptrবা ব্যবহার করতে পারেন এমন সমস্ত জিনিসের জন্য আরও উপযুক্ত করে তোলে boost::scoped_ptr


1
আমার কাছে দুটি জিনিস উল্লেখ করার মতো বলে মনে হচ্ছে: intrusive_ptrসাধারণত তুলনায় shared_ptrএটি আরও কার্যকর , যেহেতু এটি আপনাকে প্রতি বস্তুতে একক গাদা বরাদ্দ করতে দেয়। shared_ptrসাধারণ ক্ষেত্রে রেফারেন্স কাউন্টারগুলির জন্য একটি পৃথক ছোট ছোট হিপ অবজেক্ট বরাদ্দ করবে। std::make_sharedউভয় বিশ্বের সেরা পেতে ব্যবহার করা যেতে পারে। shared_ptrশুধুমাত্র একটি একক গাদা বরাদ্দ দিয়ে।
আরভিড

আমার একটি সম্ভবত সম্পর্কিত নয় প্রশ্ন: সমস্ত পয়েন্টারকে কেবল shared_ptrএস দ্বারা প্রতিস্থাপন করে আবর্জনা সংগ্রহ কার্যকর করা যেতে পারে ? (সাইক্লিক রেফারেন্সগুলি সমাধান করার জন্য গণনা করা হচ্ছে না)
শেঠ কার্নেগি

@ শেঠ কার্নেগি: সমস্ত পয়েন্টারই ফ্রি স্টোরে বরাদ্দকৃত কিছুতে দেখানো হবে না ting
সিলিকো

2
@ থাই_মান্ড্রিল তবে এটি কাজ করে যদি নিজস্ব শ্রেণীর ডেস্ট্রাক্টর ক্লায়েন্ট কোডের চেয়ে পৃথক অনুবাদ ইউনিটে (.cpp-file) সংজ্ঞায়িত করা হয়, যা পিম্পল-আইডিয়োমে যেভাবেই দেওয়া হয়। কারণ এই অনুবাদ ইউনিটটি সাধারণত পিম্পলটির সম্পূর্ণ সংজ্ঞাটি জানে এবং তাই এর ধ্বংসকারী (যখন এটি অটো_পিটারকে ধ্বংস করে) সঠিকভাবে পিম্পলটি ধ্বংস করে। আমি যখন এই সতর্কতাগুলি দেখেছি তখন আমি এর জন্যও ভয় পেয়েছিলাম, কিন্তু আমি চেষ্টা করেছিলাম এবং এটি কাজ করে (পিম্পলের ধ্বংসকারীকে ডেকে আনে)। পিএস .: কোনও উত্তর দেখতে দয়া করে আমার জন্য @-সাইনট্যাক্স ব্যবহার করুন।
খ্রিস্টান রাউ

2
ডক্সে উপযুক্ত লিঙ্ক যুক্ত করে তালিকার ব্যবহার্যতা বৃদ্ধি করা হয়েছিল।
ulidtko

5

এছাড়াও রয়েছে লোকি যা নীতি ভিত্তিক স্মার্ট পয়েন্টার প্রয়োগ করে।

নীতি-ভিত্তিক স্মার্ট পয়েন্টারগুলিতে অন্যান্য উল্লেখ, অনেক সংকলক দ্বারা একাধিক উত্তরাধিকারের সাথে খালি বেস অপ্টিমাইজেশনের দুর্বল সমর্থনের সমস্যার সমাধান:


1

প্রদত্তগুলি ছাড়াও, সুরক্ষা কেন্দ্রিক কিছু রয়েছে:

SaferCPlusPlus

mse::TRefCountingPointerস্মার্ট পয়েন্টার মত একটি রেফারেন্স গণনা std::shared_ptr। পার্থক্যটি mse::TRefCountingPointerহ'ল নিরাপদ, ছোট এবং দ্রুত, তবে কোনও থ্রেড সুরক্ষা ব্যবস্থা নেই। এবং এটি "নাল নট" এবং "ফিক্সড" (পুনঃ-প্রত্যাবর্তনযোগ্য) সংস্করণগুলিতে আসে যা নিরাপদে ধরে নেওয়া যায় যা সর্বদা একটি বৈধভাবে বরাদ্দকৃত বস্তুর দিকে নির্দেশ করে। সুতরাং মূলত, যদি আপনার লক্ষ্য বস্তুটি অ্যাসিক্রোনাস থ্রেডগুলির মধ্যে ভাগ করা থাকে তবে ব্যবহার করুন std::shared_ptr, অন্যথায় mse::TRefCountingPointerএটি সর্বোত্তম।

mse::TScopeOwnerPointerএর মতো boost::scoped_ptr, তবে এটি mse::TScopeFixedPointer"দৃ strong়-দুর্বল" পয়েন্টার সম্পর্কের মতো std::shared_ptrএবং এর সাথে একত্রে কাজ করে std::weak_ptr

mse::TScopeFixedPointerস্ট্যাকগুলিতে বরাদ্দকৃত অবজেক্টগুলিকে নির্দেশ করে বা যার "মালিকানাধীন" পয়েন্টার স্ট্যাকের উপরে বরাদ্দ করা হয়। কোনও রানটাইম ব্যয় ছাড়াই সংকলন-সময় সুরক্ষা বাড়ানোর জন্য এটি (উদ্দেশ্যমূলক) সীমাবদ্ধ। "স্কোপ" পয়েন্টারগুলির মূল বিষয়টি মূলত পরিস্থিতিগুলির একটি সেটকে সনাক্ত করতে হয় যা যথেষ্ট সরল এবং নির্ধারক যে কোনও (রানটাইম) সুরক্ষা ব্যবস্থা প্রয়োজনীয় নয়।

mse::TRegisteredPointerকাঁচা পয়েন্টারের মতো আচরণ করে, ব্যতীত তার লক্ষ্যটি যখন লক্ষ্য বস্তুটি নষ্ট হয়ে যায় তখন স্বয়ংক্রিয়ভাবে null_ptr এ সেট হয়। এটি বেশিরভাগ পরিস্থিতিতে কাঁচা পয়েন্টারগুলির জন্য সাধারণ প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে। কাঁচা পয়েন্টারের মতো এটির কোনও অভ্যন্তরীণ থ্রেড সুরক্ষা নেই। তবে বিনিময়ে এটি স্ট্যাকের বরাদ্দকৃত বস্তুগুলিকে লক্ষ্য করে কোনও সমস্যা নেই (এবং সংশ্লিষ্ট পারফরম্যান্স বেনিফিট অর্জন)। রান-টাইম চেকগুলি সক্ষম করা হলে, এই পয়েন্টারটি অবৈধ মেমরির অ্যাক্সেস থেকে নিরাপদ। mse::TRegisteredPointerবৈধ অবজেক্টগুলির দিকে ইঙ্গিত করার সময় কাঁচা পয়েন্টার হিসাবে একই আচরণ করার কারণে এটি একটি সংকলন-সময় নির্দেশিকার সাথে "অক্ষম" (স্বয়ংক্রিয়ভাবে সম্পর্কিত কাঁচা পয়েন্টার দ্বারা প্রতিস্থাপিত) হতে পারে, এটি ডিবাগ / পরীক্ষায় বাগগুলি ধরতে সহায়তা করার অনুমতি দেয় / বিটা মোডগুলি রিলিজ মোডে কোনও ওভারহেড ব্যয় না করার সময়।

কেন এবং কীভাবে সেগুলি ব্যবহার করবেন সে সম্পর্কে এখানে একটি নিবন্ধ দেওয়া আছে। (দ্রষ্টব্য, নির্লজ্জ প্লাগ।)

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