为什么new []分配额外的内存?

iBa*_*hus 3 c++

我正在阅读"用C++思考",我对新操作员感到困惑.这是本书的代码:

//: 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;
} ///:~
Run Code Online (Sandbox Code Playgroud)

这是"ArrayOperatorNew.out"中跟踪的内容

new Widget
Widget::new: 40 bytes
*
delete Widget
~Widget::delete
new Widget[25]
Widget::new[]: 1004 bytes
*************************
delete []Widget
~~~~~~~~~~~~~~~~~~~~~~~~~
Widget::delete[]
Run Code Online (Sandbox Code Playgroud)

我对数字1004感到困惑.为什么它不是1000?这本书说:

这个额外的四个字节是其中所述 系统还保存有阵列的信息,特别是,在阵列中的对象的数量.

但是系统是什么?这是如何完成的?编译器有帮助吗?

Ida*_*n K 5

当使用new []时,运行时需要一些方法来记住分配的数组的大小,因此它知道在使用delete []时要释放多少.在你的特定实现中,它的记忆方式是分配保持大小的额外四个字节(它不必以这种方式工作).

您可以在C++ FAQ中阅读更多相关信息.