এর অনেক কারণ থাকতে পারে। তাদের কয়েকটি তালিকা করতে:
- স্মার্ট পয়েন্টারগুলি সম্প্রতি সম্প্রতি স্ট্যান্ডার্ডের অংশে পরিণত হয়েছে। ততক্ষণে তারা অন্যান্য গ্রন্থাগারের অংশ ছিল
- তাদের প্রাথমিক ব্যবহার মেমরি ফুটো এড়ানোর জন্য; অনেক লাইব্রেরির নিজস্ব মেমরি পরিচালনা নেই; সাধারণত তারা ইউটিলিটি এবং এপিআই সরবরাহ করে
- এগুলি মোড়ক হিসাবে বাস্তবায়িত হয়, যেহেতু তারা আসলে বস্তুগুলি এবং পয়েন্টার নয়। কাঁচা পয়েন্টারগুলির তুলনায় যার অতিরিক্ত সময় / স্থান ব্যয় হয়; গ্রন্থাগারগুলির ব্যবহারকারীরা এ জাতীয় ওভারহেড রাখতে চান না
সম্পাদনা : স্মার্ট পয়েন্টার ব্যবহার করা সম্পূর্ণ বিকাশকারীদের পছন্দ। এটি বিভিন্ন কারণের উপর নির্ভর করে।
কর্মক্ষমতা সমালোচনামূলক সিস্টেমে আপনি স্মার্ট পয়েন্টারগুলি ব্যবহার করতে চাইবেন না যা ওভারহেড উত্পন্ন করে
যে প্রকল্পটির পশ্চাদপটে সামঞ্জস্য প্রয়োজন, আপনি স্মার্ট পয়েন্টারগুলি ব্যবহার করতে নাও চান যাতে সি ++ 11 নির্দিষ্ট বৈশিষ্ট্য রয়েছে
সম্পাদনা 2 নীচে উত্তীর্ণ হওয়ার কারণে 24 ঘন্টার ব্যবধানে বেশ কয়েকটি ডাউনভোটের স্ট্রিং রয়েছে। উত্তরটি কেন নিম্নচোট করা হয়েছে তা বুঝতে আমি ব্যর্থ হই যদিও নীচে কেবল একটি অ্যাড-অন পরামর্শ এবং উত্তর নয়।
তবে সি ++ আপনাকে সর্বদা বিকল্পগুলি খোলা রাখতে সহায়তা করে। :) উদা
template<typename T>
struct Pointer {
#ifdef <Cpp11>
typedef std::unique_ptr<T> type;
#else
typedef T* type;
#endif
};
এবং আপনার কোডে এটি ব্যবহার করুন:
Pointer<int>::type p;
যারা বলেন যে স্মার্ট পয়েন্টার এবং কাঁচা পয়েন্টার আলাদা, আমি তার সাথে একমত। উপরের কোডটি কেবল একটি ধারণা ছিল যেখানে কেউ এমন একটি কোড লিখতে পারে যা কেবল একটি দিয়ে বিনিময়যোগ্য, এটি বাধ্যবাধকতা#define
নয় ;
উদাহরণস্বরূপ, T*
স্পষ্টভাবে মুছতে হবে তবে স্মার্ট পয়েন্টারটি তা করে না। আমরা এটি Destroy()
হ্যান্ডেল করার জন্য একটি শিখরযুক্ত হতে পারে।
template<typename T>
void Destroy (T* p)
{
delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
// do nothing
}
এবং এটি হিসাবে ব্যবহার করুন:
Destroy(p);
একইভাবে, কোনও কাঁচা পয়েন্টারের জন্য আমরা এটি সরাসরি অনুলিপি করতে পারি এবং স্মার্ট পয়েন্টারটির জন্য আমরা বিশেষ ক্রিয়াকলাপ ব্যবহার করতে পারি।
Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));
যেখানে Assign()
হিসাবে:
template<typename T>
T* Assign (T *p)
{
return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
// use move sematics or whateve appropriate
}