Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

delete[] ใน C++ รู้ขนาดอาร์เรย์ได้อย่างไร

ออเปอเรเตอร์ new ใช้สำหรับจัดสรรหน่วยความจำแบบไดนามิกบน heap ออเปอเรเตอร์ delete[] ใช้สำหรับคืนหน่วยความจำนั้น new จะจัดเก็บจำนวนองค์ประกอบที่สร้างไว้ในบล็อกหัว (header block) เพื่อให้ delete[] สามารถคืนหน่วยความจำได้ถูกต้องโดยใช้จำนวนนั้น

โค้ดตัวอย่าง (Dynamic 2D Array)

#include <iostream>
using namespace std;

int main() {
    int B = 4; // rows
    int A = 5; // cols
    int** a = new int*[B]; // อาร์เรย์ pointer ขนาด B

    for(int i = 0; i < B; ++i)
        a[i] = new int[A]; // แต่ละ row จัดสรรอาร์เรย์ขนาด A

    // ใส่ค่า
    for(int i = 0; i < B; ++i)
        for(int j = 0; j < A; ++j)
            a[i][j] = i;

    // พิมพ์
    for(int i = 0; i < B; ++i)
        for(int j = 0; j < A; ++j)
            cout << a[i][j] << "\n";

    // ลบ: ต้องลบแต่ละ row ก่อน แล้วค่อยลบอาร์เรย์ pointer
    for(int i = 0; i < B; ++i)
        delete[] a[i];
    delete[] a;

    return 0;
}

ผลลัพธ์

0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3

กลไกการทำงาน:

  • new T[n] จัดสรรหน่วยความจำขนาด n * sizeof(T) + overhead
  • Overhead (มัก 4-8 ไบต์) จัดเก็บ n (จำนวนองค์ประกอบ) และอาจรวมขนาด/alignment
  • delete[] ptr อ่าน overhead เพื่อรู้ว่าต้องเรียก destructor กี่ครั้ง และคืนหน่วยความจำเท่าไหร่
  • นี่คือเหตุผลที่ต้องใช้ delete[] สำหรับอาร์เรย์ และ delete สำหรับวัตถุเดี่ยว - การผิดพลาดจะทำให้ memory leak หรือ undefined behavior

แนวทางปัจจุบัน: ใช้ std::vector, std::unique_ptr, std::make_unique เพื่อหลีกเลี่ยจการจัดการหน่วยความจำด้วยมือ