C++-c++ 中的delete 和delete[]

发布于 2016-11-16 02:04:29 字数 305 浏览 1350 评论 6

一直不明白,为什么会设计出 delete和delete[]两种操作,因为大家都知道:
1,int *p = new int 是分配一个单元,int *p = new int[100]是分配100个单元,
2,delete p 是删除释放一个单元,delete [] p 是释放 多个单元,具体的数据目是查系统的分配表得到的;
3,那么既然可以查表,为什么不直接让delete 和 delete[]合并为一个操作,具体释放多少查表得到既可以了,

可能是设计师考虑到了什么东西了吧,比如效率等,
但是我想不出别的理由,请大家帮我解释一下,谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

浮生未歇 2017-10-22 23:03:37

编译器在 new[] 多分配的一个int空间,可以通过重载 new[] 看到编译器这一行为:

//: C13:ArrayOperatorNew.cpp 
// Operator new for arrays 
#include <new> // Size_t definition 
#include <fstream> 
using namespace std; 

ofstream trace("ArrayOperatorNew.out"); 

class Widget 
{ 
    enum { sz = 10 }; 
    int i[sz]; 
public: 
    Widget() { trace << "*"; } 
    ~Widget() { trace << "~"; } 

    void* operator new(size_t sz) 
    { 
        trace << "Widget::new: " 
            << sz << " bytes" << endl; 
        return ::new char[sz]; 
    } 
    void operator delete(void* p) 
    { 
        trace << "Widget::delete" << endl; 
        ::delete []p; 
    } 

    void* operator new[](size_t sz) 
    { 
        trace << "Widget::new[]: " 
            << sz << " bytes" << endl; 
        return ::new char[sz]; 
    } 
    void operator delete[](void* p)
    { 
        trace << "Widget::delete[]" << endl; 
        ::delete []p; 
    } 
}; 

int main() { 
    trace << "new Widget" << endl; 
    Widget* w = new Widget; 
    trace << "ndelete Widget" << endl; 
    delete w; 

    trace << "nnew Widget[25]" << endl; 
    Widget* wa = new Widget[25]; 
    trace << "ndelete []Widget" << endl; 
    delete []wa; 
} ///:~ 

上面代码输出的结果是:

new Widget
Widget::new: 40 bytes
*
delete Widget
~Widget::delete

new Widget[25]
Widget::new[]: 1004 bytes

delete []Widget
~~~~~~~~~~~~~~~~~~~~~~~~~Widget::delete[]

以上代码来自《C++编程思想》第13章overload new&delete部分。注意到上面 1004,多余的4bytes就是编译器为new[]额外分配的。

虐人心 2017-10-21 13:47:19

编译器负责跟踪数组元素的数量是run-time system分配了额外的空间,存储了数组的元素个数。但是runtime自己不能判断应该删除的是一个数组还是单个指针。我们必须告诉它怎么做:我们在使用delete[]的时候,告知是要删除一个数组,这个时候先取出数组的大小,然后进行空间释放。但是如果是直接使用delete,就不会执行此操作,这也是为了效率考虑的。

参考资料:
How does delete[] know it's an array? (C++)

浮生未歇 2017-10-03 10:08:09

一个是删除指针,一个是删除数组指针. 合并的话,阅读的时候就不知道删除的是什么样的指针。
有句话说,存在即是合理。

灵芸 2017-05-15 23:41:00

去看<<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[].
具体内容就做二道贩子来转述了。

归属感 2017-04-20 05:16:28

delete[]的数目不是查系统分配表,而是new的时候多申请了一个int的空间,在最前面填上了数组的大小。删除的时候先读那个大小再删除。如果是new单个,通常就可以不分配那个大小的空间了,这两种情况可能不一样,所以不能合并。
不过如果编译器把new实现成了new[1]的话就一样了,这个和编译器实现有关系。

虐人心 2017-04-04 08:17:09

编译器没那么智能吧,我想

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文