Перегрузка оператора new[]

Если я перегружаю оператор new[] в своем классе

void *MyString::operator new[](std::size_t size)
{
    //...
}

и далее пытаюсь при помощи new[] создать массив объектов

MyString *myS = new MyString[length];

Что конкретно передается в length? При попытке передать в length количество элементов массива, в реализации оператора переменная size увеличивается. В некоторых источниках говорится, что size это объем памяти, необходимый для массива с учетом размера класса, но при попытке использовать

length = size / sizeof(MyString);

все еще выдает некорректные значения

Полный код

#include <iostream>

using namespace std;

class MyChar
{
public:
    MyChar(){};
    ~MyChar(){};

    void *operator new[](size_t);

private:
    char value = '0';
};

void *MyChar::operator new[](size_t size)
{
    cout << "Size in class: " << size << endl;
    return nullptr;
}

int main() {
    int len = 10;
    
    cout << len << endl;
    MyChar *c = new MyChar[len];
    
    return 0;
}

Ответы (1 шт):

Автор решения: user7860670

При перегрузке operator new [] функция будет получать на вход требуемый размер буфера, в байтах. Этот размер может быть больше, чем размер, непосредственно необходимый для хранения массива, так как в нем же может храниться служебная информация, например размер массива. Потребность в этой служебной информации может возникать например при создании массива объектов с нетривиальным деструктором - при вызове delete [] компилятор должен будет сгенерировать код, который проходится по каждому элементу массива и вызывает деструктор, а размер массива в этот оператор не передается.

#include <iostream>
#include <new>
#include <cstddef>

struct t_Trivial
{
    ~t_Trivial(void) = default;

    void * operator new [](::std::size_t const size)
    {
        ::std::cout << "sizeof(trivial) " << sizeof(t_Trivial)
            << " size: " << size << ::std::endl;
        return ::operator new [](size);
    }
};

struct t_NonTrivial
{
    ~t_NonTrivial(void){}

    void * operator new [](::std::size_t const size)
    {
        ::std::cout << "sizeof(nontrivial) " << sizeof(t_NonTrivial)
            << " size: " << size << ::std::endl;
        return ::operator new [](size);
    }
};

int main()
{
    ::std::size_t const len{10};
    auto p_trivial{new t_Trivial [len]};
    auto p_non_trivial{new t_NonTrivial [len]};
    return 0;
}

sizeof(trivial) 1 size: 10
sizeof(nontrivial) 1 size: 18

online compiler

→ Ссылка