C++-c++ 中的delete 和delete[]
一直不明白,为什么会设计出 delete和delete[]两种操作,因为大家都知道:
1,int *p = new int 是分配一个单元,int *p = new int[100]是分配100个单元,
2,delete p 是删除释放一个单元,delete [] p 是释放 多个单元,具体的数据目是查系统的分配表得到的;
3,那么既然可以查表,为什么不直接让delete 和 delete[]合并为一个操作,具体释放多少查表得到既可以了,
可能是设计师考虑到了什么东西了吧,比如效率等,
但是我想不出别的理由,请大家帮我解释一下,谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
编译器在 new[] 多分配的一个int空间,可以通过重载 new[] 看到编译器这一行为:
上面代码输出的结果是:
以上代码来自《C++编程思想》第13章overload new&delete部分。注意到上面 1004,多余的4bytes就是编译器为new[]额外分配的。
编译器负责跟踪数组元素的数量是run-time system分配了额外的空间,存储了数组的元素个数。但是runtime自己不能判断应该删除的是一个数组还是单个指针。我们必须告诉它怎么做:我们在使用delete[]的时候,告知是要删除一个数组,这个时候先取出数组的大小,然后进行空间释放。但是如果是直接使用delete,就不会执行此操作,这也是为了效率考虑的。
参考资料:
How does delete[] know it's an array? (C++)
一个是删除指针,一个是删除数组指针. 合并的话,阅读的时候就不知道删除的是什么样的指针。
有句话说,存在即是合理。
去看<<The Design and Evolution of C++>>的10.3 Array Allocation 章节。
Bjarne Stroustrup解释了为什么同时有
void* operator new(size_t sz);和void* operator new[](size_t sz);
为了配对,自然也就有了delete和delete[].
具体内容就做二道贩子来转述了。
delete[]的数目不是查系统分配表,而是new的时候多申请了一个int的空间,在最前面填上了数组的大小。删除的时候先读那个大小再删除。如果是new单个,通常就可以不分配那个大小的空间了,这两种情况可能不一样,所以不能合并。
不过如果编译器把new实现成了new[1]的话就一样了,这个和编译器实现有关系。
编译器没那么智能吧,我想