এসটিডি :: অটো_প্রেটার থেকে স্টাড :: অনন্য_পিটার


185

নতুন স্ট্যান্ডার্ড আসার সাথে (এবং কিছু সংকলক ইতিমধ্যে উপলব্ধ অংশ), নতুন ধরণের std::unique_ptrজন্য একটি প্রতিস্থাপন বলে মনে করা হয় std::auto_ptr

তাদের ব্যবহারগুলি কি ঠিক ওভারল্যাপ করে (তাই আমি আমার কোডটিতে একটি বিশ্বব্যাপী সন্ধান / প্রতিস্থাপন করতে পারি (আমি এটি করতাম তা নয়, তবে যদি আমি তা করতাম)) বা ডকুমেন্টেশন পড়া থেকে স্পষ্ট নয় এমন কিছু পার্থক্য সম্পর্কে আমার সচেতন হওয়া উচিত?

এছাড়াও যদি এটি প্রত্যক্ষ প্রতিস্থাপন হয় তবে কেবলমাত্র উন্নত করার পরিবর্তে কেন এটি একটি নতুন নাম দিন std::auto_ptr?

উত্তর:


219

আপনি একটি বিশ্বব্যাপী অনুসন্ধান / প্রতিস্থাপন করতে পারবেন না কারণ আপনি কোনও অনুলিপি করতে পারেন auto_ptr(পরিচিত ফলাফল সহ), তবে একটি unique_ptrকেবল স্থানান্তরিত হতে পারে। কিছু যে দেখতে লাগে

std::auto_ptr<int> p(new int);
std::auto_ptr<int> p2 = p; 

কমপক্ষে এটির মতো হয়ে উঠতে হবে

std::unique_ptr<int> p(new int);
std::unique_ptr<int> p2 = std::move(p);

অন্যান্য পার্থক্য হিসাবে, unique_ptrঅ্যারে সঠিকভাবে পরিচালনা করতে পারেন (এটি কল করবে delete[], যখন auto_ptrকল করার চেষ্টা করবে) delete


101
অন্যদিকে, এই সন্ধান / প্রতিস্থাপনটি করলে কেবল সংকলনের ত্রুটি ঘটবে, এটি চুপচাপ কোডটি ভঙ্গ করবে না যতদূর আমি দেখতে পাচ্ছি। সুতরাং এটি করা নিরাপদ, আপনি যদি পরে নিজেই সংকলন ত্রুটিগুলি ঠিক করেন
jalf

7
@ জালফ: প্রকৃতপক্ষে, আমি এমন একটি পাল্টা উদাহরণের কথা ভাবতে পারি না যা অটো_পটার্স এবং ইউবিতে অনন্য_পটারগুলির সাথে ভাল সংজ্ঞায়িত হবে।
কুবিবি

1
সুতরাং দেখে মনে হচ্ছে অনন্য_পিটারটি অটো_পিটারের বর্ধন: অ্যারে সমর্থন করুন এবং অস্পষ্টতা অপসারণ করুন
বায়ান হুয়াং

92

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

  • ফাংশন স্কোপ ভেরিয়েবল:
    100% সামঞ্জস্যপূর্ণ, যতক্ষণ না আপনি এটিকে অন্য কোনও ফাংশনে মান দ্বারা পাস করেন না।
  • রিটার্নের ধরণ:
    100% সামঞ্জস্যপূর্ণ নয় তবে 99% সামঞ্জস্যপূর্ণ ভুল বলে মনে হচ্ছে না।
  • মান অনুসারে ফাংশন প্যারামিটার:
    একটি সতর্কতার সাথে 100% সামঞ্জস্যপূর্ণ, unique_ptrএকটি std::moveকল দিয়ে যেতে হবে । এইটি সহজ তাই সংকলকটি অভিযোগ করবে যে আপনি এটি সঠিকভাবে না পেলে।
  • রেফারেন্স দ্বারা ফাংশন প্যারামিটার:
    100% সামঞ্জস্যপূর্ণ।
  • শ্রেণীর সদস্যের পরিবর্তনশীল:
    এটি একটি কৌশলপূর্ণ। std::auto_ptrs কপি শব্দার্থবিজ্ঞান মন্দ। যদি শ্রেণিটি অনুলিপি করতে অস্বীকার করে তবে std::unique_ptrপ্রতিস্থাপনের ড্রপ a তবে, আপনি যদি ক্লাসকে যুক্তিসঙ্গত অনুলিপি শব্দার্থক দেওয়ার চেষ্টা করেন, আপনাকে std::auto_ptrহ্যান্ডলিং কোডটি পরিবর্তন করতে হবে । এটি সহজ কারণ সংকলকটি সঠিকভাবে না পেলে অভিযোগ করবে। যদি আপনি কোনও বিশেষ কোড ছাড়াই কোনও std::auto_ptrসদস্যের সাথে কোনও শ্রেণীর অনুলিপিটি মঞ্জুরি দিয়ে থাকেন তবে আপনার জন্য লজ্জা এবং শুভকামনা।

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


8
"যাইহোক আপনাকে আপনার কোডটি রিফ্যাক্টর করতে হবে" এর জন্য +1। অটো_পিটারগুলি কেবলমাত্র 20.4.5 / 3 এর জন্যই ভাল যা তাদের পক্ষে ভাল।
কুবিবি

8
আমাকে এটি যুক্ত করতে দাও যে আপনার উচিত সমস্ত উপায়ে আপনার কোডটিতে অনন্য_পিটার দ্বারা অটো_পিটারটি প্রতিস্থাপন করা এবং সংকলনের ত্রুটিগুলি ঠিক করা উচিত। আপনি বিস্মিত হবেন যে এটি কতটি বাগ উন্মুক্ত করবে।
বার্তোসজ মাইলিউস্কি

36

আফাইক, unique_ptrসরাসরি প্রতিস্থাপন নয়। এটির যে প্রধান ত্রুটি এটি সংশোধন করে তা হ'ল মালিকানার অন্তর্নিহিত স্থানান্তর।

std::auto_ptr<int> a(new int(10)), b;
b = a; //implicitly transfers ownership

std::unique_ptr<int> a(new int(10)), b;
b = std::move(a); //ownership must be transferred explicitly

অন্যদিকে, unique_ptrসম্পূর্ণ নতুন ক্ষমতা থাকবে: সেগুলি পাত্রে সংরক্ষণ করা যেতে পারে।


8
স্কট মায়ার্স তার "কার্যকর সি ++" (তৃতীয় সংস্করণ) আইটেম 13 (পৃষ্ঠা 64) এও উল্লেখ করেছেন যে এসটিএল পাত্রে তাদের সামগ্রীর "স্বাভাবিক" অনুলিপি আচরণ প্রদর্শিত হবে, সুতরাং ধারকগুলির auto_ptrঅনুমতি নেই।
কিয়াং শো

31

গট ডাব্লু # 89- তে হার্ব সটারের একটি দুর্দান্ত ব্যাখ্যা রয়েছে :

অটো_পিটারের সাথে কী চুক্তি? অটো_সিপিআরটি সর্বাধিক দানশীলতার সাথে সি ++ সরানো শব্দার্থবিজ্ঞানের আগে একটি অনন্য_পিটার তৈরির বীরত্বপূর্ণ প্রচেষ্টা হিসাবে চিহ্নিত করা হয়। অটো_পিটার এখন হ্রাস করা হয়েছে এবং নতুন কোডে ব্যবহার করা উচিত নয়।

আপনার যদি বিদ্যমান কোড বেসে অটো_সিপি থাকে, আপনি যখন একটি সুযোগ পান অটো_সিপিআরটিকে অনন্য_সেপ্টারে প্রতিস্থাপনের জন্য একটি বিশ্বব্যাপী অনুসন্ধান করার চেষ্টা করবেন; ব্যবহারের সিংহভাগ একই কাজ করবে এবং এটি (একটি সংকলন-সময় ত্রুটি হিসাবে) উদ্ঘাটিত হতে পারে বা একটি বাগ বা দু'টিকে ঠিক করে দিতে পারে (যা আপনি জানেন না) had

অন্য কথায়, যখন একটি বিশ্বব্যাপী অনুসন্ধান এবং প্রতিস্থাপন অস্থায়ীভাবে আপনার কোডটিকে "বিভক্ত" করতে পারে, আপনার যাহাই হউক না কেন: সংকলন ত্রুটিগুলি সংশোধন করতে কিছুটা সময় নিতে পারে, তবে দীর্ঘমেয়াদে আপনাকে আরও অনেক ঝামেলা বাঁচাতে পারে।


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