คำถามติดแท็ก delete-operator

ในภาษาการเขียนโปรแกรม C ++ ตัวดำเนินการลบจะเรียกตัวทำลายของอาร์กิวเมนต์ที่กำหนดและส่งคืนหน่วยความจำที่จัดสรรโดยใหม่กลับไปที่ฮีป

26
การลบองค์ประกอบอาร์เรย์ใน JavaScript - ลบ vs splice
ความแตกต่างระหว่างการใช้คืออะไรผู้ประกอบการในองค์ประกอบอาร์เรย์เป็นเทียบกับการใช้วิธี ?deleteArray.splice ตัวอย่างเช่น: myArray = ['a', 'b', 'c', 'd']; delete myArray[1]; // or myArray.splice (1, 1); ทำไมถึงมีวิธีการประกบกันถ้าฉันสามารถลบองค์ประกอบอาร์เรย์อย่างที่ฉันสามารถทำได้กับวัตถุ



10
อนุญาตให้ลบหรือไม่
มันอนุญาตให้delete this;หากคำสั่งลบเป็นคำสั่งสุดท้ายที่จะดำเนินการในอินสแตนซ์ของชั้นเรียนที่? แน่นอนฉันแน่ใจว่าวัตถุที่แสดงโดยthis-pointer นั้นnewถูกสร้างขึ้นอย่างสมบูรณ์ ฉันกำลังคิดเกี่ยวกับสิ่งนี้: void SomeModule::doStuff() { // in the controller, "this" object of SomeModule is the "current module" // now, if I want to switch over to a new Module, eg: controller->setWorkingModule(new OtherModule()); // since the new "OtherModule" object will take the lead, // I want to get …

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

16
ลบ [] รู้ได้อย่างไรว่าเป็นอาร์เรย์
เอาล่ะฉันคิดว่าเราทุกคนยอมรับว่าสิ่งที่เกิดขึ้นกับรหัสต่อไปนี้ไม่ได้กำหนดขึ้นอยู่กับสิ่งที่ส่งผ่าน void deleteForMe(int* pointer) { delete[] pointer; } ตัวชี้อาจเป็นสิ่งที่แตกต่างกันได้ดังนั้นการดำเนินการอย่างไม่มีเงื่อนไขdelete[]จึงไม่ได้กำหนดไว้ อย่างไรก็ตามสมมติว่าเรากำลังส่งตัวชี้อาร์เรย์ int main() { int* arr = new int[5]; deleteForMe(arr); return 0; } คำถามของฉันคือในกรณีนี้ที่ตัวชี้เป็นอาร์เรย์ใครเป็นคนรู้เรื่องนี้ ฉันหมายถึงจากมุมมองของภาษา / คอมไพเลอร์ไม่มีความคิดว่าarrเป็นตัวชี้อาร์เรย์หรือไม่เมื่อเทียบกับตัวชี้ไปยัง int เดียว Heck ไม่รู้ด้วยซ้ำว่าarrถูกสร้างขึ้นแบบไดนามิกหรือไม่ แต่ถ้าฉันทำสิ่งต่อไปนี้แทน int main() { int* num = new int(1); deleteForMe(num); return 0; } ระบบปฏิบัติการมีความฉลาดพอที่จะลบเพียง int เดียวและไม่ใช้ 'ความสนุกสนานในการฆ่า' บางประเภทโดยการลบหน่วยความจำที่เหลือเกินกว่าจุดนั้น (ตรงกันข้ามกับสตริงที่strlenไม่มีการตัด\0ทอนและจะดำเนินต่อไปจนกว่าจะถึง ฮิต …


6
Visual Studio ทำอะไรกับตัวชี้ที่ถูกลบและทำไม?
หนังสือ C ++ ที่ฉันอ่านระบุว่าเมื่อตัวชี้ถูกลบโดยใช้deleteโอเปอเรเตอร์หน่วยความจำในตำแหน่งที่ชี้ไปนั้น "ว่าง" และสามารถเขียนทับได้ NULLนอกจากนี้ยังระบุว่าตัวชี้จะยังคงชี้ไปที่สถานที่เดียวกันจนกว่าจะมีพระราชเสาวนีย์หรือตั้งค่า ใน Visual Studio 2012 อย่างไรก็ตาม ดูเหมือนจะไม่เป็นเช่นนั้น! ตัวอย่าง: #include <iostream> using namespace std; int main() { int* ptr = new int; cout << "ptr = " << ptr << endl; delete ptr; cout << "ptr = " << ptr << endl; system("pause"); return 0; …

12
ทำไมไม่ลบตั้งค่าตัวชี้เป็น NULL?
ฉันสงสัยเสมอว่าทำไมการตั้งค่าตัวชี้เป็น NULL โดยอัตโนมัติหลังจากลบไม่ได้เป็นส่วนหนึ่งของมาตรฐาน หากได้รับการดูแลแล้วข้อขัดข้องจำนวนมากเนื่องจากตัวชี้ที่ไม่ถูกต้องจะไม่เกิดขึ้น แต่ต้องบอกว่าฉันคิดได้ว่าทำไมมาตรฐานถึง จำกัด สิ่งนี้: ประสิทธิภาพ: คำแนะนำเพิ่มเติมอาจทำให้deleteประสิทธิภาพช้าลง อาจเป็นเพราะพconstอยน์เตอร์ จากนั้นอีกครั้งมาตรฐานอาจทำอะไรบางอย่างสำหรับกรณีพิเศษนี้ฉันเดา ไม่มีใครรู้เหตุผลที่แน่นอนที่ไม่อนุญาตให้ทำเช่นนี้?

6
การลบตัวชี้ใน C ++
บริบท: ฉันพยายามห่อหัวตัวชี้เราเพิ่งเห็นพวกเขาเมื่อสองสามสัปดาห์ก่อนในโรงเรียนและขณะฝึกซ้อมวันนี้ฉันเจอเรื่องงี่เง่า? ปัญหาอาจตรงไปตรงมาสำหรับคุณ แต่ฉันไม่ค่อยมีประสบการณ์ในการเขียนโปรแกรมเลย ฉันเคยเห็นคำถามไม่กี่ข้อใน SO เกี่ยวกับการลบพอยน์เตอร์ แต่ดูเหมือนว่าทั้งหมดจะเกี่ยวข้องกับการลบคลาสไม่ใช่ตัวชี้ 'ธรรมดา' (หรือคำที่เหมาะสมอาจเป็นอะไรก็ได้) นี่คือรหัสที่ฉันพยายาม วิ่ง: #include <iostream>; using namespace std; int main() { int myVar, *myPointer; myVar = 8; myPointer = &myVar; cout << "delete-ing pointers " << endl; cout << "Memory address: " << myPointer << endl; // Seems I can't *just* …

5
การลบตัวชี้ไปที่ const (T const *)
ฉันมีคำถามพื้นฐานเกี่ยวกับตัวชี้ const ฉันไม่ได้รับอนุญาตให้เรียกใช้ฟังก์ชันสมาชิกที่ไม่ใช่ const โดยใช้ตัวชี้ const อย่างไรก็ตามฉันได้รับอนุญาตให้ทำสิ่งนี้กับตัวชี้ const: delete p; สิ่งนี้จะเรียกตัวทำลายของคลาสซึ่งในสาระสำคัญคือ 'วิธีการ' ที่ไม่ใช่ const เหตุใดจึงได้รับอนุญาต เป็นเพียงการสนับสนุนสิ่งนี้หรือไม่: delete this; หรือมีเหตุผลอื่น?

5
คุณ 'realloc' ใน C ++ ได้อย่างไร?
ฉันจะreallocอยู่ใน C ++ ได้อย่างไร? ดูเหมือนว่าจะหายไปจากภาษา - มีnewและdeleteแต่ไม่ใช่resize! ฉันต้องการมันเนื่องจากโปรแกรมของฉันอ่านข้อมูลมากขึ้นฉันจึงต้องจัดสรรบัฟเฟอร์ใหม่เพื่อเก็บไว้ ฉันไม่คิดว่าdeleteการใช้ตัวชี้แบบเก่าและใช้ตัวชี้newใหม่ที่ใหญ่กว่าเป็นตัวเลือกที่เหมาะสม

1
ตัวดำเนินการใหม่ () ทำงานแตกต่างกันเมื่อตัวดำเนินการลบ () ถูกลบทั้งนี้ขึ้นอยู่กับการมีอยู่ของตัวสร้างเริ่มต้น
การสร้างออบเจ็กต์ใหม่ของคลาส C โดยมีโอเปอเรเตอร์ new () ให้ข้อผิดพลาดที่นี่: 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) รหัสจะรวบรวมและเรียกใช้ อะไรคือความแตกต่างระหว่างตัวสร้างเริ่มต้นที่คอมไพเลอร์ที่สร้างโดยผู้ใช้ที่กำหนดโดยค่าเริ่มต้นที่ทำให้สิ่งนี้เกิดขึ้น? …

3
เหตุใด destructor ไม่ถูกเรียกในตัวดำเนินการลบ
ฉันพยายามโทร::deleteหาชั้นเรียนที่อยู่ในoperator deleteนั้น แต่ตัวทำลายจะไม่ถูกเรียก ฉันกำหนดคลาสMyClassที่operator deleteมีการโหลดมากเกินไป ทั่วโลกoperator deleteก็มีมากเกินไป มากเกินไปoperator deleteของจะโทรมากเกินไปทั่วโลกMyClassoperator delete class MyClass { public: MyClass() { printf("Constructing MyClass...\n"); } virtual ~MyClass() { printf("Destroying MyClass...\n"); } void* operator new(size_t size) { printf("Newing MyClass...\n"); void* p = ::new MyClass(); printf("End of newing MyClass...\n"); return p; } void operator delete(void* p) { printf("Deleting …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.