c++: 获取delete[]中的数组大小
2016-09
睿丰德信息科技有限公司
看一个小例子:
1#include <iostream>23using namespace std;45class A {6public:7 A() { cout << "A::A()" << endl; }8 ~A() { cout << "A::~A()" << endl; }9};1011int main() {12 A* a = new A[5];13 delete[] a;1415 return 0;16}编译执行输出:
A::A() A::A() A::A() A::A() A::A() A::~A() A::~A() A::~A() A::~A() A::~A()
上面的输出显示程序正确释放了5个A对象。
现在的问题是:我们在delete[] a语句中并没有给出对象数组的大小,那么系统是如何做到正确释放对象个数的呢?
接着看下面的程序段:
1#include <iostream>23using namespace std;45class A {6public:7 A() { cout << "A::A()" << endl; }8 ~A() { cout << "A::~A()" << endl; }9};1011int main() {12 A* a = new A[5];1314 int addr = (int)a - 4;15 cout << "delete[] size = " << *(int*)addr << endl;1617 delete[] a;1819 return 0;20}编译执行:
A::A() A::A() A::A() A::A() A::A() delete[] size = 5 A::~A() A::~A() A::~A() A::~A() A::~A()
结论:
系统在new一个数组对象的时候会把数组大小存放在返回的内存地址的前4个字节中。