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

这期内容当中小编将会给大家带来有关为何在调用delete[]时括号中不需要指明元素的个数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

创新互联建站专注骨干网络服务器租用十多年,服务更有保障!服务器租用,托管服务器 成都服务器租用,成都服务器托管,骨干网络带宽,享受低延迟,高速访问。灵活、实现低成本的共享或公网数据中心高速带宽的专属高性能服务器。

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

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

考虑有以下类定义。

public:
    Test(){};
    ~Test(){};
};

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

    ‍Test* pTest = new Test;

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

    delete pTest;

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

    Test* pTests = new Test[10];

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

    delete [] pTest;

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

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

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

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

struct array {
    size_t count_of_test;
   Test t[10];
};

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

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

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

所以必须配对使用。

上述就是小编为大家分享的为何在调用delete[]时括号中不需要指明元素的个数了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


当前文章:为何在调用delete[]时括号中不需要指明元素的个数
文章路径:http://azwzsj.com/article/gshhjc.html