注意delete和delete[]的区别

-- TOC --

通过new申请的内存,用delete释放。通过new[]申请的内存,用delete[]释放。不能用错了。

传统的C语言申请内存,都是一整块,如果用于数组,那么通过指针+1的方式一块块访问,释放时就是这一整块一次性释放。而C++由于引入了对象的destructor,当使用new[]申请对象数组的时候,一定要用delete[]释放,此时编译器会依次一个个调用数组中每个对象的destructor,最后再释放对象数组占用的内存

但测试发现,对于primitive data types的内存,delete和delete[]没有区别,不过,最好别作...

下面是一段测试代码:

#include <iostream>
using namespace std;


struct xyz{
    xyz(void){cout<<"hi..\n";}
    ~xyz(void){cout<<"die..\n";}
};


struct rock{
    int a;
    int b;
};


int main(void) {
    xyz *a{new xyz[4]{}};
    delete[] a;

    xyz *b{new xyz{}};
    delete b;

    // POD or primitive types are OK, but don't do it if possible!
    rock *c{new rock[4]{}};
    delete c;

    return 0;
}

修改delete即可自行测试观察。

本文链接:https://cs.pynote.net/sf/c/cpp/202209024/

-- EOF --

-- MORE --