অপারেটর নতুন () অন্যরকম আচরণ করে যখন অপারেটর মুছুন () মুছে ফেলা হয় ডিফল্ট কনস্ট্রাক্টরের অস্তিত্বের উপর নির্ভর করে


17

অপারেটর নতুন () দিয়ে শ্রেণি সি এর একটি নতুন অবজেক্ট তৈরি করা এখানে একটি ত্রুটি দেয়:

class C
{
public:
    C() {}
    virtual ~C() {}

    void operator delete(void*) = delete;
};


int main()
{
    C* c = new C;
}

সঙ্গে C2280: 'void C::operator delete(void *)': function was explicitly deleted

কিন্তু আমি যখন প্রতিস্থাপন C() {} সঙ্গে C() = default; বা যাতে কম্পাইলার একটি ডিফল্ট কন্সট্রাকটর (যা আমি বিশ্বাস করি সঙ্গে একই প্রভাব রয়েছে সন্নিবেশ লাইন অপসারণ = default), কোড কম্পাইল এবং চালানো হবে।

সংঘটিত-উত্পাদিত ডিফল্ট কনস্ট্রাক্টর এবং ব্যবহারকারী-সংজ্ঞায়িত ডিফল্ট কনস্ট্রাক্টরের মধ্যে পার্থক্যগুলি কী তা ঘটায়?

আমি এই পোস্টিংয়ে কিছু ইঙ্গিত পেয়েছি , তবে ডি ক্লাস্টিকটি এখানে (ব্যবহারকারীর দ্বারা সরবরাহ করা কনস্ট্রাক্টর ছাড়াই) তুচ্ছ নয় কারণ ডেস্ট্রাক্টর ভার্চুয়াল, তাই না?

সর্বশেষ ভিজ্যুয়াল স্টুডিও, সি ++ 17 দিয়ে সংকলিত।


3
নিশ্চিত নয়, তবে আমি মনে করি পার্থক্যটি হ'ল ডিফল্ট কনস্ট্রাক্টরnoexcept
সেবাস্তিয়ান রেডল

1
জি ++ দিয়ে পুনরুত্পাদন করা যায় না। operator delete()কনস্ট্রাক্টর ম্যানুয়ালি লিখিত হয়েছে বা সুস্পষ্টভাবে উত্পাদিত হয়েছে কিনা সে সম্পর্কিত অনুরূপ ডায়াগনস্টিক । যা আমার প্রত্যাশার সাথে সামঞ্জস্যপূর্ণ - যেহেতু একটি ব্যতিক্রম newপ্রকাশের দ্বারা ছোঁড়া হতে পারে , তাই সংকলকটি অ্যাক্সেস করতে হবে operator delete()
পিটার

@ সেবাস্তিয়ান রেডল আপনি ঠিক বলেছেন, noexceptকোড সংকলন তৈরি করবে, তবে কীভাবে ...?
yesjho

1
@ পিটার ব্যতিক্রমটি কেবল নির্মাতা দ্বারা নিক্ষেপ করা যেতে পারে, সুতরাং যদি এটি noexceptসেবাস্তিয়ানআরডল উল্লিখিত হিসাবে থাকে, তবে একটি কল operator deleteঅন্তর্ভুক্ত করার দরকার নেই। এছাড়াও g ++ কেবলমাত্র যদি অভিযোগকারী ভার্চুয়াল হয় তবে অভিযোগ করে। অন্যথায় এটি সর্বদা সংকলন করে, এমনকি যদি কনস্ট্রাক্টর নিক্ষেপ করে।
আখরোট

@ লেডইওএম আপনার লিঙ্কটি আইপি অ্যাড্রেসগুলি পার্সিং সম্পর্কিত, যা মনে হয় এই প্রশ্নের সাথে অপ্রাসঙ্গিক। আপনি কি একটি ভুল লিঙ্ক পোস্ট করেছেন?
এলএফ

উত্তর:


17

সংঘটিত-উত্পাদিত ডিফল্ট কনস্ট্রাক্টর এবং ব্যবহারকারী-সংজ্ঞায়িত ডিফল্ট কনস্ট্রাক্টরের মধ্যে পার্থক্যগুলি কী তা ঘটায়?

newএক্সপ্রেশন সংশ্লিষ্ট অনুরোধ করে operator newএবং তারপরে কনস্ট্রাক্টরকে কল করে। যদি কনস্ট্রাক্টর নিক্ষেপ করে একটি ব্যতিক্রম newঅভিব্যক্তি অবশ্যই সম্পর্কিত operator newকল করে (মেমরি ফাঁস এড়ানোর জন্য) এর প্রভাবটি পূর্বাবস্থায় ফিরিয়ে আনতে হবেoperator delete । তাহলে আধুনিক মুছে ফেলা হয় newঅভিব্যক্তি এটা কম্পাইলার যা ফলাফল কল করতে পারবেন না error: use of deleted function 'static void C::operator delete(void*)'

কোনও noexceptনির্মাণকারী সম্ভবত একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে না, সুতরাং, সংশ্লিষ্টটি operator deleteপ্রয়োজনীয় নয় কারণ এটি কোনও newএক্সপ্রেশন দ্বারা ডাকা হবে না । একটি defaultএকটি তুচ্ছ ক্লাসের কন্সট্রাকটর একটি হল noexceptকন্সট্রাকটর। ভার্চুয়াল ডেস্ট্রাক্টরের উপস্থিতি operator deleteঅ-মুছে ফেলা প্রয়োজন কারণ বিশেষ স্কেলার মুছে ফেলা ডেস্ট্রাক্টর ( deleteবেস ক্লাস পয়েন্টারের মাধ্যমে অভিব্যক্তি সক্ষম করতে একটি বাস্তবায়ন বিশদ ) ডাকে operator delete

এটি সি ++ স্ট্যান্ডার্ড দ্বারা অনির্ধারিত বলে মনে হচ্ছে সংকলকটি অবশ্যই অভিব্যক্তি operator deleteদ্বারা কল করা না গেলেও এটি মুছে ফেলা প্রয়োজন whether অবশ্য সংশ্লিষ্ট invoking হবে বলে মনে হচ্ছে না যে যদি তা না হয় এ সব অভিব্যক্তি ঘ (ক পোস্ট বাগ রিপোর্ট )।newgccoperator deletenewdelete

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