0
点赞
收藏
分享

微信扫一扫

为什么在调用delete[]时,括号中不需要指明元素的个数?


首先为没看懂问题的同学进行简单的知识准备。

在C++中有一条简单的规则,调用new申请的内存用delete释放;调用new[]申请的内存就一定要用delete[]释放。

考虑有以下类定义。

class Test
{

public:

Test(){};

~Test(){};

};

当我们要在堆中创建一个新对象时,可以用以下代码:

Test* pTest = new Test;

当我们要释放这个对象时可以使用以下代码:

delete pTest;

当我们要在堆中创建10个对象是可以使用以下代码:

Test* pTests = newTest[10];

当我们要释放这10个对象时,与new[]相呼应,必须使用delete[]。

delete [] pTest;

两者的区别在在于带的new[]和delete[]会对每个元素调用构造函数和析构函数。

以上是每个C++语法书都会降到的内容。算是知识准备。

接下来十问题:为什么在调用delete[]时,括号中不需要指明元素的个数?

据说初期的C++在调用delete[]时是需要的指定元素个数的,但那样的话就会非常麻烦。所以后来进行了改进,在实现new[]的时候同时申请内存空间保存元素的个数。基本上是这个样子:

struct array {

size_t count_of_test;
Test[10];
};

在调用new[]时先通过malloc()申请内存时多申请一点空间保存count_of_test,然后是返回给用户t空间的地址。这个地址要在malloc获得的array地址上加一个偏移量。最后对这个t空间调用每个元素的构造函数。

调用delete[]的参数实际上是t空间的地址。先对这个地址参数进行减偏移量运算得到array地址并取得count_of_test,然后对t空间调用析构函数count_of_test次。最后以array地址作为参数调用free()函数。

除了正确调用构造函数/析构函数以外,还要处理保存元素个数的空间。

所以必须配对使用。

怎么样这个解释可以接受么?

更多精彩文章请关注【面向对象思考】微信公众号。

为什么在调用delete[]时,括号中不需要指明元素的个数?_析构函数

举报

相关推荐

0 条评论