คำถามติดแท็ก destructor

21
มี destructor สำหรับ Java หรือไม่?
มี destructor สำหรับ Java หรือไม่? ฉันดูเหมือนจะไม่สามารถค้นหาเอกสารใด ๆ เกี่ยวกับเรื่องนี้ หากไม่มีฉันจะบรรลุผลเช่นเดียวกันได้อย่างไร เพื่อให้คำถามของฉันเฉพาะเจาะจงมากขึ้นฉันกำลังเขียนแอปพลิเคชันที่เกี่ยวข้องกับข้อมูลและข้อกำหนดระบุว่าควรมีปุ่ม 'รีเซ็ต' ที่ทำให้แอปพลิเคชันกลับสู่สถานะเดิมที่เพิ่งเปิดตัว อย่างไรก็ตามข้อมูลทั้งหมดจะต้องเป็น 'สด' เว้นแต่ว่าแอปพลิเคชันจะปิดหรือกดปุ่มรีเซ็ต การเป็นโปรแกรมเมอร์ C / C ++ ฉันคิดว่านี่น่าจะเป็นเรื่องง่าย (และด้วยเหตุนี้ฉันวางแผนที่จะใช้มันครั้งสุดท้าย) ฉันจัดโครงสร้างโปรแกรมของฉันเพื่อให้วัตถุ 'ที่สามารถรีเซ็ตได้' ทั้งหมดจะอยู่ในระดับเดียวกันเพื่อที่ฉันจะสามารถทำลายวัตถุ 'สด' ทั้งหมดเมื่อกดปุ่มรีเซ็ต ฉันคิดว่าถ้าทั้งหมดที่ฉันทำคือเพียงการตรวจสอบข้อมูลและรอให้ตัวรวบรวมขยะเก็บพวกเขาจะไม่มีหน่วยความจำรั่วถ้าผู้ใช้ของฉันป้อนข้อมูลซ้ำแล้วกดปุ่มรีเซ็ตหรือไม่ ฉันคิดเช่นกันเนื่องจาก Java ค่อนข้างเป็นภาษาที่ควรมีวิธีป้องกันไม่ให้เกิดขึ้นหรือแก้ไขปัญหานี้อย่างสง่างาม

9
ฉันจะล้างวัตถุ Python อย่างถูกต้องได้อย่างไร
class Package: def __init__(self): self.files = [] # ... def __del__(self): for file in self.files: os.unlink(file) __del__(self)ด้านบนล้มเหลวด้วยข้อยกเว้นของ AttributeError ฉันเข้าใจว่าPython ไม่รับประกันการมีอยู่ของ "ตัวแปรทั่วโลก" (ข้อมูลสมาชิกในบริบทนี้?) เมื่อ__del__()มีการเรียกใช้ หากเป็นเช่นนั้นและนี่คือเหตุผลสำหรับข้อยกเว้นฉันจะแน่ใจได้อย่างไรว่าวัตถุถูกทำลายอย่างถูกต้อง
462 python  destructor 

7
ฉันต้องโทรหา destructor เสมือนจริงอย่างชัดเจนหรือไม่
เมื่อลบล้างคลาสใน C ++ (พร้อมด้วย destructor เสมือนจริง) ฉันกำลังใช้ destructor อีกครั้งเป็นเสมือนบนคลาสที่สืบทอด แต่ฉันต้องเรียกใช้ตัวทำลายฐานหรือไม่? ถ้าอย่างนั้นฉันคิดว่ามันเป็นเช่นนี้ ... MyChildClass::~MyChildClass() // virtual in header { // Call to base destructor... this->MyBaseClass::~MyBaseClass(); // Some destructing specific to MyChildClass } ฉันถูกไหม?
351 c++  destructor 

16
โยนข้อยกเว้นออกมาจากผู้ทำลาย
คนส่วนใหญ่บอกว่าจะไม่ส่งข้อยกเว้นใด ๆ จากผู้ทำลายล้างซึ่งส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนด Stroustrup ทำให้จุดที่"เวกเตอร์ destructor อย่างชัดเจนเรียก destructor สำหรับทุกองค์ประกอบนี่ก็หมายความว่าถ้าองค์ประกอบ destructor โยนการทำลายเวกเตอร์ล้มเหลว ... ไม่มีวิธีที่ดีในการป้องกันข้อยกเว้นที่ถูกโยนจาก destructors ดังนั้นไลบรารี ทำให้ไม่มีการค้ำประกันถ้า destructor องค์ประกอบโยน"(จากภาคผนวก E3.2) บทความนี้ดูเหมือนจะพูดเป็นอย่างอื่น - การขว้างปา destructors นั้นไม่เป็นไร ดังนั้นคำถามของฉันคือ - หากการขว้างปาจาก destructor ส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนดคุณจะจัดการกับข้อผิดพลาดที่เกิดขึ้นระหว่าง destructor ได้อย่างไร หากมีข้อผิดพลาดเกิดขึ้นในระหว่างการดำเนินการล้างข้อมูลคุณเพียงเพิกเฉยมันได้หรือไม่ หากเป็นข้อผิดพลาดที่สามารถจัดการสแต็กได้ แต่ไม่ถูกต้องใน destructor มันไม่เหมาะสมที่จะโยนข้อยกเว้นออกจาก destructor ใช่ไหม เห็นได้ชัดว่าข้อผิดพลาดประเภทนี้หายาก แต่เป็นไปได้



11
ลบตัวชี้ไปยังคลาสย่อยหรือไม่เรียกตัวทำลายคลาสพื้นฐานหรือไม่
ฉันมีอันclass Aที่ใช้การจัดสรรหน่วยความจำฮีปสำหรับหนึ่งในฟิลด์ของมัน คลาส A ถูกสร้างและเก็บเป็นฟิลด์ตัวชี้ในคลาสอื่น ( class B. เมื่อฉันทำกับวัตถุของคลาส B ฉันเรียกdeleteซึ่งฉันคิดว่าเรียกว่า destructor ... แต่สิ่งนี้เรียกว่า destructor ของคลาส A ด้วยหรือไม่ แก้ไข: จากคำตอบที่ฉันใช้ (โปรดแก้ไขหากไม่ถูกต้อง): delete ของอินสแตนซ์ของ B เรียก B :: ~ B (); สายไหน A::~A(); A::~A ควรdeleteกำหนดตัวแปรสมาชิกที่จัดสรรฮีปทั้งหมดของวัตถุ A อย่างชัดเจน ในที่สุดการจัดเก็บหน่วยความจำบล็อกกล่าวว่าตัวอย่างของการเรียน B จะถูกส่งกลับไปยังกอง - เมื่อใหม่ถูกนำมาใช้เป็นครั้งแรกที่จัดสรรบล็อกของหน่วยความจำบนกองก่อสร้างแล้วเรียกเพื่อเริ่มต้นมันตอนนี้หลังจาก destructors ทั้งหมดได้รับการเรียกเพื่อจบวัตถุ บล็อกที่วัตถุที่อยู่จะถูกส่งกลับไปยังกอง


12
ทำไมเราต้องมี destructor เสมือนแท้ใน C ++
ฉันเข้าใจถึงความต้องการตัวทำลายล้างเสมือนจริง แต่ทำไมเราต้องมี destructor เสมือนแท้? ในหนึ่งในบทความ C ++ ผู้เขียนได้กล่าวว่าเราใช้ destructor เสมือนจริงเมื่อเราต้องการสร้างบทคัดย่อของคลาส แต่เราสามารถสร้างคลาสนามธรรมโดยการทำให้ฟังก์ชั่นสมาชิกใด ๆ เสมือนเสมือนจริง ดังนั้นคำถามของฉันคือ เมื่อไหร่ที่เราจะสร้างผู้ทำลายล้างเสมือนจริง? ใครสามารถยกตัวอย่างเรียลไทม์ได้บ้าง? เมื่อเราสร้างคลาสนามธรรมมันเป็นวิธีปฏิบัติที่ดีที่จะทำให้ destructor นั้นเสมือนจริงหรือไม่? ถ้าใช่ .. แล้วทำไมล่ะ

6
ทำลายวัตถุได้อย่างไร?
เท่าที่ฉันรู้ (ซึ่งน้อยมาก) มีสองวิธีดังนี้ $var = new object() แล้ว: // Method 1: Set to null $var = null; // Method 2: Unset unset($var); วิธีอื่นที่ดีกว่า? ฉันแยกขนอยู่ที่นี่หรือเปล่า?

10
ตัวทำลาย C ++ ถูกเรียกเมื่อใด
คำถามพื้นฐาน: โปรแกรมเรียกเมธอดตัวทำลายคลาสใน C ++ เมื่อใด ฉันได้รับแจ้งว่ามันถูกเรียกเมื่อใดก็ตามที่วัตถุอยู่นอกขอบเขตหรืออยู่ภายใต้ไฟล์delete คำถามเฉพาะเพิ่มเติม: 1) หากวัตถุถูกสร้างขึ้นผ่านตัวชี้และตัวชี้นั้นถูกลบในภายหลังหรือกำหนดที่อยู่ใหม่เพื่อชี้ไปยังวัตถุที่ชี้เพื่อเรียกตัวทำลายของมัน (สมมติว่าไม่มีสิ่งอื่นชี้ไปที่มัน)? 2) ติดตามคำถามที่ 1 สิ่งที่กำหนดเมื่อวัตถุอยู่นอกขอบเขต (ไม่เกี่ยวกับเวลาที่วัตถุออกจาก {block} ที่กำหนด) ดังนั้นกล่าวอีกนัยหนึ่งว่าผู้ทำลายถูกเรียกบนวัตถุในรายการที่เชื่อมโยงเมื่อใด 3) คุณต้องการโทรหาผู้ทำลายด้วยตนเองหรือไม่?
118 c++  destructor 

7
อะไรคือความแตกต่างระหว่างการใช้ IDisposable vs a destructor ใน C #?
เมื่อไหร่ที่ฉันจะใช้ IDispose ในคลาสซึ่งตรงข้ามกับ destructor ฉันอ่านบทความนี้แต่ฉันยังไม่เข้าใจประเด็นนี้ สมมติฐานของฉันคือถ้าฉันใช้ IDispose กับวัตถุฉันสามารถ 'ทำลาย' มันได้อย่างชัดเจนแทนที่จะรอให้คนเก็บขยะทำ ถูกต้องหรือไม่ นั่นหมายความว่าฉันควรเรียก Dispose on an object อย่างชัดเจนเสมอหรือไม่? ตัวอย่างทั่วไปของสิ่งนี้มีอะไรบ้าง?
101 c#  .net  dispose  destructor 

3
ใน C # อะไรคือความแตกต่างระหว่างตัวทำลายและเมธอด Finalize ในคลาส?
อะไรคือความแตกต่างระหว่างตัวทำลายและเมธอด Finalize ในคลาส ฉันเพิ่งค้นพบว่า Visual Studio 2008 พิจารณาตัวทำลายที่มีความหมายเหมือนกันกับวิธี Finalize ซึ่งหมายความว่า Visual Studio จะไม่ยอมให้คุณกำหนดทั้งสองวิธีพร้อมกันในคลาส ตัวอย่างเช่นส่วนของรหัสต่อไปนี้: class TestFinalize { ~TestFinalize() { Finalize(); } public bool Finalize() { return true; } } ให้ข้อผิดพลาดต่อไปนี้ในการเรียกให้เสร็จสิ้นในตัวทำลาย: การเรียกไม่ชัดเจนระหว่างวิธีการหรือคุณสมบัติต่อไปนี้: 'TestFinalize. ~ TestFinalize ()' และ 'TestFinalize.Finalize ()' และหากมีการแสดงความคิดเห็นการเรียกไปยัง Finalize จะทำให้เกิดข้อผิดพลาดดังต่อไปนี้: พิมพ์ 'ManagementConcepts.Service.TestFinalize' แล้วกำหนดสมาชิกที่เรียกว่า 'Finalize' ด้วยประเภทพารามิเตอร์เดียวกัน

2
GNU GCC (g ++): เหตุใดจึงสร้าง dtors หลายตัว
การพัฒนาสภาพแวดล้อม: GNU GCC (g ++) 4.1.2 ในขณะที่ฉันกำลังพยายามตรวจสอบวิธีเพิ่ม 'การครอบคลุมโค้ด - โดยเฉพาะการครอบคลุมฟังก์ชัน' ในการทดสอบหน่วยฉันพบว่า dtor บางคลาสดูเหมือนจะถูกสร้างขึ้นหลายครั้ง พวกคุณบางคนมีความคิดว่าทำไมโปรด? ฉันพยายามและสังเกตสิ่งที่ฉันกล่าวถึงข้างต้นโดยใช้รหัสต่อไปนี้ ใน "test.h" class BaseClass { public: ~BaseClass(); void someMethod(); }; class DerivedClass : public BaseClass { public: virtual ~DerivedClass(); virtual void someMethod(); }; ใน "test.cpp" #include <iostream> #include "test.h" BaseClass::~BaseClass() { std::cout << "BaseClass dtor …
91 c++  g++  destructor 

3
shared_ptr มายากล :)
นายLidströmและฉันมีข้อโต้แย้ง :) คำกล่าวอ้างของMr.Lidströmคือโครงสร้างshared_ptr<Base> p(new Derived);ไม่ต้องการให้ Base มีตัวทำลายเสมือน: Armen Tsirunyan : "จริงเหรอshared_ptr จะล้างข้อมูลอย่างถูกต้องหรือไม่ในกรณีนี้คุณช่วยสาธิตวิธีการใช้เอฟเฟกต์นั้นได้ไหม" Daniel Lidström : " shared_ptrใช้ตัวทำลายของตัวเองเพื่อลบอินสแตนซ์คอนกรีตสิ่งนี้เรียกว่า RAII ในชุมชน C ++ คำแนะนำของฉันคือคุณเรียนรู้ทุกอย่างเกี่ยวกับ RAII มันจะทำให้การเข้ารหัส C ++ ของคุณง่ายขึ้นมากเมื่อคุณใช้ RAII ในทุกสถานการณ์ " Armen Tsirunyan : "ฉันรู้เกี่ยวกับ RAII และฉันก็รู้ด้วยว่าในที่สุดตัวทำลายshared_ptrอาจลบ px ที่เก็บไว้เมื่อ pn ถึง 0 แต่ถ้า px มีตัวชี้ประเภทคงที่Baseและตัวชี้ชนิดไดนามิกเป็นDerivedดังนั้นเว้นแต่จะBaseมีตัวทำลายเสมือน จะส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนดแก้ไขฉันถ้าฉันทำผิด " Daniel Lidström : " …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.