Size: a a a

Compiler Development

2021 July 12

K

Kir in Compiler Development
Просто new[] кладёт перед началом массива его размер, а указатель возвращает сразу после. А delete[], соответственно, его читает
источник

а

а это кто in Compiler Development
да
источник

а

а это кто in Compiler Development
но не всегда
источник

I

InsidE in Compiler Development
тогда это уже решает аллокатор оси
источник

I

InsidE in Compiler Development
или самописный, если эмбеддед всякий
источник

а

а это кто in Compiler Development
есть альтернативные способы реализации механизма new[]/delete[] как написано в этом FAQ

https://isocpp.org/wiki/faq/freestore-mgmt#num-elems-in-new-array
источник

I

InsidE in Compiler Development
короче, менеджер кучи держит список всех выделений памяти с их размерами, когда просто на указателе вызывается delete, то это идет к аллокатору
источник

I

InsidE in Compiler Development
который знает, сколько байт с этого одреса было выделено и помечает их свободными
источник

а

а это кто in Compiler Development
нет, это решает реализация C++ потому что у оси нельзя запросить сколько объектов было выделено
источник

I

InsidE in Compiler Development
еще раз, аллокатор знает, с какого адреса и сколько было выделено
источник

M

MrSmith in Compiler Development
Ничего не понятно, на чем писать, зачем писать, почему не wasm коробки
источник

I

InsidE in Compiler Development
ему достаточно только дать адрес начала блока и сказать пометь этот блок как свободный
источник

а

а это кто in Compiler Development
аллокатор оси знает, но delete[] у аллокатора такую информацию запросить не может
источник

M

MrSmith in Compiler Development
Был доклад на цыпаконе, как раз, что то вроде, как работает алокатор, там и про обоймы и про слабы и про алгоритмы для увеличения когерентности Кеша
источник

I

InsidE in Compiler Development
это ему и не надо, delete дает только адрес начала блока, т.е. этот T* это адрес начала блока
источник

а

а это кто in Compiler Development
надо. delete[] не просто освобождает память, он так же должен вызывать деструкторы объектов
источник

M

MrSmith in Compiler Development
Ставлю на то что перед указателем просто колличество объектов
источник

I

InsidE in Compiler Development
по типк указателя и вызывает
источник

I

InsidE in Compiler Development
передавая в деструктор this по принципу T* + sizeof(t)
источник

а

а это кто in Compiler Development
В данном примере delete[] не может определить количество элементов по типу указателя

T *arr = new T[10];

delete[] arr;
источник