নতুন (এটি) এই ক্লাস () একটি খারাপ ধারণা?


9
class FooView final : public Something
{
    ...
    void refresh()
    {
        this->~FooView();
        new (this) FooView();
    }
}

আমি এই প্রতিমাটি কখনও দেখিনি, এবং দেখে মনে হচ্ছে এটি সত্যিই সূক্ষ্ম এবং অগোছালো হতে পারে তবে আমি এটির সাথে আসলেই কোনও সমস্যা (যতক্ষণ না FooViewচূড়ান্ত) ভাবতে পারি না । এটা কি একটি খারাপ ধারণা?


সম্পর্কিত / ডুপ: স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / ৫৮৮74৪৯6363৩ / । আমরা কি ধরণের পুরো প্রসঙ্গটি পেতে পারি? এটা ব্যাপার।
নাথান অলিভার

উত্তর:


12

আপনি এটি করতে পারেন, তবে আপনার যদি রেফারেন্স বা কনস্টের সদস্য থাকে বা শ্রেণীর ধরণের পরিবর্তন হয় তবে সেই জন্য আপনাকে মেমোরি লন্ডারিংয়ের প্রয়োজন হবে।

এই বিবেচনা:

struct FooView {
    const int val;

    void refresh()
    {
        this->~FooView();
        new (this) FooView{5};
    }
}

int main() {
    FooView fv{9};

    std::cout << fv.val; // surely 9!
    fv.refresh();
    std::cout << fv.val; // hmm... val is a const object, so it's 9 still?
}

এই অনির্ধারিত আচরণ এড়াতে আপনার ব্যবহার করে স্মৃতি মেশানো উচিত std::launder। সংকলক ধরে নিবে যে জীবনযাত্রা fvব্যতীত অন্য কোনও কারণে প্রভাবিত হবে না }। লন্ডারিংটি কম্পাইলারকে ধরে নিবে যে কোনও বস্তু আছে যার সাথে সম্পর্কিত নয় fv:

int main() {
    FooView fv{9};

    std::cout << fv.val; // surely 9!
    fv.refresh();
    std::cout << std::launder(&fv)->val; // yay, 5
}

এখন এটা কি ভাল ধারণা? আমি এর বিরুদ্ধে পরামর্শ দেব কারণ এটি বিভ্রান্তির কারণ হতে পারে তবে এটি নিরাপদে করা যায়।

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