重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这期内容当中小编将会给大家带来有关为何在调用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[]时括号中不需要指明元素的个数了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。