Why does the new [] allocate additional memory?

I read "Thinking in C ++" and I am confused by the new operator. Here is the code from the book:

//: 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;
} ///:~

and here is the contents of the track in "ArrayOperatorNew.out"

new Widget
Widget::new: 40 bytes
*
delete Widget
~Widget::delete
new Widget[25]
Widget::new[]: 1004 bytes
*************************
delete []Widget
~~~~~~~~~~~~~~~~~~~~~~~~~
Widget::delete[]

I am confused about the number 1004. Why is it not 1000? The book says:

These additional four bytes: the system stores information about the array, in particular, the number of objects in the array.

But which system? How is this achieved? Does the compiler help here?

+3
source share
5 answers

[] , , delete []. , ( ).

++.

+5

, .

delete [] - . , . -.

, new [] size_t, . ,

sizeof( size_t ) + numberOfElements * sizeof ( ObjectType )
+1

, .
++ , , delete [], , . , delete [] delete .

0

. / [] ( , ).

​​ /. (, SmartHeap).

(, ).

0

Source: https://habr.com/ru/post/1722766/


All Articles