কেন স্ট্যান্ডার্ড :: অটো_পিটার <> স্ট্যান্ডার্ড পাত্রে ব্যবহার করা ভুল?


217

কেন std::auto_ptr<>স্ট্যান্ডার্ড পাত্রে ব্যবহার করা ভুল ?


5
অবশ্যই এটির জন্য একটি +1 কারণ আমি অনেক লোককে এই ভুল হতে দেখেছি। এটি জিজ্ঞাসা করা একটি দুর্দান্ত প্রশ্ন।
twokats

সম্পর্কিত আইটেমটি পড়ুন দয়া করে। এই প্রশ্নটি অন্য দিক থেকে এখানে বিবেচনা করা হয়। অটো_পিটার এবং এসটিএল পাত্রে সম্পর্কে আরও বুঝতে সহায়তা করতে পারে। stackoverflow.com/questions/8630552/...
নিকোলে


1
moveশব্দার্থক এবং unique_ptrসম্পর্কিত সমস্যা এড়াতে ডিজাইন করা হয়েছিল auto_ptr। সি ++ 03 তে, ভাষাটি এমন কোনও শ্রেণীর লেখার মতো শক্তিশালী ছিল না auto_ptrযে সংকলক এবং ভাষাটি L এবং r মানগুলিতে পার্থক্য করতে সক্ষম না হওয়ায় সমস্ত পরিস্থিতিতে দৃশ্যের সাথে সঠিকভাবে এবং সুরক্ষিতভাবে আচরণ করে তাই কাঙ্ক্ষিত আচরণ পেতে কিছু "হ্যাক" ব্যবহার করা হত অধিকাংশ সময়.
ফিল 1970

চমৎকার নিবন্ধ: এসটিএল কনটেইনার এবং অটো_পটার্স - তারা
কোয়ান্টসার্ট.

উত্তর:


124

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

উদাহরণস্বরূপ এই কোডটি ধরুন:

class X
{
};

std::vector<std::auto_ptr<X> > vecX;
vecX.push_back(new X);

std::auto_ptr<X> pX = vecX[0];  // vecX[0] is assigned NULL.

এই সীমাবদ্ধতা কাটিয়ে উঠতে আপনার কাছে সি ++ 11 না থাকলে আপনার std::unique_ptr, std::shared_ptrবা std::weak_ptrস্মার্ট পয়েন্টার বা বুস্ট সমতুল্য ব্যবহার করা উচিত । এই স্মার্ট পয়েন্টারগুলির জন্য বুস্ট লাইব্রেরি ডকুমেন্টেশন এখানে।


7
আপনার যদি ভাগ করে নেওয়া মালিকানার প্রয়োজন না হয় তবে আপনাকে বুস্ট পয়েন্টার পাত্রেও বিবেচনা করা উচিত।
me22

4
unique_ptrঅনুলিপিও বারণ করে না, সুতরাং নির্দিষ্ট এসটিএল অপারেশন সঠিকভাবে কাজ করবে না যতক্ষণ না তারা এর সরানো শব্দার্থবিজ্ঞান ব্যবহার করতে পারে।
মাইক ওয়েলার

4
"এই সীমাবদ্ধতা কাটিয়ে উঠতে আপনার ব্যবহার করা উচিত std::unique_ptr": যে শ্রেণি টেম্পলেটটি কেবল স্থানান্তরিত শব্দার্থবিজ্ঞানের কারণে বিদ্যমান থাকতে পারে (এর স্পেসিফিকেশনের মূলসূত্র উল্লেখ প্রয়োজন), সুতরাং এটির জন্য মূলত সি ++ 11 প্রয়োজন। তবে (এবং সম্পর্কিত) সি ++ 11 স্ট্যান্ডার্ড আর বলে না যে কোনও এসটিএল উপাদান ধরণের অবশ্যই "অনুলিপি-গঠনমূলক" এবং "কার্যনির্বাহী" হতে হবে; চলন-গঠনমূলক এবং সরানো-যোগ্যযোগ্য পর্যাপ্ত হওয়া being প্রকৃতপক্ষে unique_ptrদৃষ্টান্তগুলি কেবল চালচলনযোগ্য এবং সরানো-যোগ্য। কিন্তু তাই হয় auto_ptrদৃষ্টান্ত! ফলস্বরূপ, সি ++ 11 এ আপনি auto_ptrযা করতে পারেন তা করতে পারেন unique_ptr
মার্ক ভ্যান লিউউইন

আপনি resetএবং releaseপ্রয়োজন হিসাবে @ মার্কওয়ানলিউউইন
ফ্রিক

2
@ আর্টচেটফ্রাক: হুম, আমি বুঝতে পারছি না। কি? "আপনি resetএবং release" না থাকলে, আমি দেখতে পাচ্ছি না এটি কীভাবে আমার মন্তব্যে কোনও কিছুর জন্য প্রযোজ্য। লক্ষ্য করুন auto_ptrএবং unique_ptrউভয়ই এই দুটি পদ্ধতি রয়েছে এবং উভয় ক্ষেত্রেই তারা একই কাজ করে।
মার্ক ভ্যান লিউউইন

66

কপি শব্দার্থবিদ্যা এর auto_ptrপাত্রে সঙ্গে সামঞ্জস্যপূর্ণ নয়।

বিশেষত, একজনের auto_ptrঅপর অনুলিপি করা দুটি সমান বস্তু তৈরি করে না যেহেতু একজন পয়েন্টারের মালিকানা হারিয়ে ফেলেছে।

আরও সুনির্দিষ্টভাবে, কোনও অনুলিপি auto_ptrঅনুলিপিগুলির মধ্যে একটির অনুলিপি তৈরির কারণ হয়ে যায়। এই পাত্রে কোনটি অবশিষ্ট রয়েছে তা সংজ্ঞায়িত করা হয়নি। অতএব, আপনি যদি auto_ptrsপাত্রে সংরক্ষণ করেন তবে আপনি এলোমেলোভাবে পয়েন্টারগুলির অ্যাক্সেস হারাতে পারেন ।


39

বিষয় সম্পর্কে দুটি সুপার চমৎকার নিবন্ধ:


কারণ আমি মনে করি যে প্রায় দু'বছরের মধ্যবর্তী সময়ে তিনি সম্ভবত সমস্যাটি সমাধান করেছিলেন।
পপি

27
@ ডেড এমএমজি: হ্যাঁ, আপনি ঠিক বলেছেন। তবে তা আমার উদ্দেশ্য ছিল না। যদি কেউ এই থ্রেডে আসে এবং সে সম্পর্কে auto_ptrএবং জিনিসগুলি শিখতে চায় তবে এই লিঙ্কগুলি সহায়ক হবে, আমি নিশ্চিত।
লেজার

ডুপ্লিকেট প্রচুর আছে যা আরও সাম্প্রতিক।
পপি

8
@ ডিড এমএমজি: এই প্রশ্নটিকে নকল হিসাবে বন্ধ করা হয়নি এবং তাই এটি এক্সটেনশনের জন্য উন্মুক্ত। এখানে আগে যা বলা হয়নি তা লাজার বলেছিলেন। আমার ধারণা, সে সুযোগে এসেছিল।
সেবাস্তিয়ান মাচ

দ্বিতীয় লিঙ্কের ব্যাখ্যাগুলি, যা কল করার পরে সমস্যাটি বিশ্লেষণ করে sort(), এখানে সমস্ত উত্তরগুলির চেয়ে পরিষ্কার cle
বিশৃঙ্খলা

17

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

কার্যকর এসটিএল (স্কট মায়ার্স) আইটেম 8-এ কী কী ভুল হতে পারে তার বিশদ বিবরণ রয়েছে এবং কার্যকর সি ++ (স্কট মায়ার্স) আইটেম 13-তে একটি বিশদ বিবরণ নেই।


12

এসটিএল পাত্রে অন্তর্ভুক্ত আইটেমগুলির অনুলিপি সঞ্চয় করে। যখন একটি অটো_পিটার অনুলিপি করা হয়, এটি পুরানো পিটিআরটি বাতিল করে দেয়। অনেক ধারক পদ্ধতি এই আচরণ দ্বারা নষ্ট হয়ে যায়।


তবে, ইউনিক_পিটার ব্যবহার করার সময় আপনি একই জিনিসটি পান কারণ কেবলমাত্র একটি অনন্য_পটরের অবজেক্টটির মালিকানা থাকতে পারে?
ট্রেসার

2
@ ট্র্যাকার unique_ptrযেকোন উপযুক্ত সি ++ 11 অবজেক্টের মতো কেবল তখনই তার সংস্থার মালিকানা স্থানান্তর করতে পারে যখন মুভ-বিল্ট বা নির্ধারিত হয়, নিশ্চিত করে যে প্রোগ্রামারটি ইচ্ছাকৃতভাবে একটি std::move(sourceObject)বা একটি অস্থায়ী পাস করতে হবে , বরং একটি ললিউউ পাস করার পরিবর্তে এবং অনিচ্ছাকৃতভাবে / অপ্রত্যাশিতভাবে এটির পরিবর্তিত হওয়ার পরিবর্তে অনুলিপি-অ্যাসাইনমেন্ট ... যা এখানে পুরোপুরি জোর দেওয়া হয়েছিল, এর মূল সমস্যা ছিল auto_ptr
আন্ডারস্কোর_ড

4

সি ++ 03 স্ট্যান্ডার্ড (আইএসও-আইইসি 14882-2003) 20.4.5 অনুচ্ছেদে 3 অনুচ্ছেদে বলেছেন:

[...] [ দ্রষ্টব্য: [...] অটো_সিপি স্ট্যান্ডার্ড লাইব্রেরি ধারক উপাদানগুলির জন্য অনুলিপিযোগ্য এবং প্রয়োজনীয় প্রয়োজনীয়তাগুলি পূরণ করে না এবং এইভাবে একটি অটো_সিপিটারের সাথে একটি স্ট্যান্ডার্ড লাইব্রেরি ধারক ইনস্ট্যান্ট করে অপরিজ্ঞাত আচরণের ফলাফল দেয়। - শেষ নোট ]

সি ++ 11 স্ট্যান্ডার্ড (আইএসও-আইইসি 14882-2011) পরিশিষ্ট D.10.1 অনুচ্ছেদে 3 বলেছেন:

[...] দ্রষ্টব্য: [...] অটো_সিপিটারের উদাহরণগুলি মুভকনস্ট্রাক্টেবল এবং মুভএইসাইনেবলের প্রয়োজনীয়তা পূরণ করে, তবে কপি কন্ট্রাস্ট্রিয়েবল এবং কপিরএসিগনেবলের প্রয়োজনীয়তা পূরণ করে না। - শেষ নোট]

সি ++ ১৪ স্ট্যান্ডার্ড (আইএসও-আইইসি 14882-2014) পরিশিষ্টে বলেছেন C.4.2 এনেক্সেক্স ডি: সামঞ্জস্য বৈশিষ্ট্যগুলি:

পরিবর্তন : শ্রেণি টেম্পলেটগুলি অটো_পিটার, অ্যানারি_ফাংশন, এবং বাইনারি_ফংশন, ফাংশন টেম্পলেটগুলি এলোমেলো_স্যাফেল এবং ফাংশন টেম্পলেটগুলি (এবং তাদের ফিরতি প্রকারগুলি) পিটিআর_ফুন, মেম_ফুন, মেম_ফুন_রেফ, বাইন্ড ১ ম এবং বাইন্ড 2 সংজ্ঞায়িত করা হয়নি।
যুক্তি : নতুন বৈশিষ্ট্য দ্বারা বর্ধিত।
মূল বৈশিষ্ট্যের উপর প্রভাব : এই শ্রেণীর টেম্পলেট এবং ফাংশন টেম্পলেটগুলি ব্যবহার করে যা বৈধ সি ++ 2014 কোড এই আন্তর্জাতিক স্ট্যান্ডার্ডে সংকলন করতে ব্যর্থ হতে পারে।

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