Перегрузка оператора 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 шт):
При перегрузке 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