new 和 delete
new
用 new 申请的内存最少占用 1 个字节——尽管我们申请的可能是 0 个字节。
delete
/delete[]
delete 和 delete[] 都会归还空间,但是 delete[] 会询问元素数量,并析构数组中的每个元素,而 delete 只会析构一个元素。
尽管虚析构函数允许我们正常 delete 掉指向子类对象的基类指针,但是在基类指针上使用 delete[] 可能是有错的:
#include <cstdio>
struct A {
double a;
virtual ~A() {
puts("~A()");
fflush(stdout);
}
};
struct B : A {
double b;
~B() override {
puts("~B()");
fflush(stdout);
}
};
static_assert(sizeof(A) == 16);
static_assert(sizeof(B) == 24);
int main() {
A *array_of_A = new B[2];
delete [] array_of_A; // <-- 大问题!
}