为何在调用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[]时括号中不需要指明元素的个数
URL地址:https://www.cdcxhl.com/article22/gshhjc.html

成都网站建设公司_创新互联,为您提供品牌网站建设手机网站建设电子商务品牌网站制作网站内链响应式网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

外贸网站制作