لماذا هو جd الأمراض المنقولة جنسيا::قائمة:: واضح() لا يدعو المدمر?

StackOverflow https://stackoverflow.com//questions/12665588

  •  11-12-2019
  •  | 
  •  

سؤال

انظر إلى هذا الرمز:

class test
{
    public:
        test() { cout << "Constructor" << endl; };
        virtual ~test() { cout << "Destructor" << endl; };
};

int main(int argc, char* argv[])
{
    test* t = new test();
    delete(t);
    list<test*> l;
    l.push_back(DNEW test());
    cout << l.size() << endl;
    l.clear();
    cout << l.size() << endl;
}

وبعد ذلك ، انظر إلى هذا الإخراج:

    Constructor
    Destructor
    Contructor
    1
    0

السؤال هو:لماذا لا يتم استدعاء المدمر لعنصر القائمة في l.clear()?

هل كانت مفيدة؟

المحلول

قائمتك هي من المؤشرات.المؤشرات لا تحتوي على مدمرات.إذا كنت تريد أن يتم استدعاء المدمر ، فعليك المحاولة list<test> بدلا من ذلك.

نصائح أخرى

بديل أفضل لتحرير المؤشرات باستخدام delete, ، أو استخدام شيء يستخلص ذلك بعيدا (مثل المؤشرات الذكية أو حاويات المؤشر) ، هو ببساطة إنشاء الكائنات مباشرة على المكدس.

يجب أن تفضل test t; أكثر test * t = new test(); نادرا ما تريد التعامل مع أي مؤشر يمتلك موردا ، ذكيا أو غير ذلك.

إذا كنت تريد استخدام std::list من العناصر 'الحقيقية' ، بدلا من مؤشرات إلى عناصر ، لن يكون لديك هذه المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top