لماذا هو جd الأمراض المنقولة جنسيا::قائمة:: واضح() لا يدعو المدمر?
-
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
من العناصر 'الحقيقية' ، بدلا من مؤشرات إلى عناصر ، لن يكون لديك هذه المشكلة.
لا تنتمي إلى StackOverflow