温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-01-05 09:46:13 来源:亿速云 阅读:118 作者:柒染 栏目:大数据

这期内容当中小编将会给大家带来有关为何在调用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[]时括号中不需要指明元素的个数了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI