Ринат Велиахмедов:
new int; // выделяется 4 байта под число, плюс 4-8 байт служебных данных перед ними.
malloc(4); // выделение 4 байт, Без служебных данных.
Ринат Велиахмедов: Чтобы корректно работал delete/delete[]
Вообще, на 100% уверен, что в различных архитектурах может быть различная реализация. Но для работы delete[] необходима служебная информация.
Ринат Велиахмедов: Очень правильное замечание (не пользуюсь malloc/free, так что даже не уточнял, как они работают). Тогда разница только в вызовах конструктора/деструктора. Что опять же приводит к тезису, что нафиг malloc/free в С++ не нужен. Только для совместимости.
maaGames: malloc всегда записывает служебную информацию перед выделяемой памятью. Иначе free элементарно не узнает размер освобождаемого участка памяти.
А new не является чем-то особенным. Внутри он так же использует malloc.
Николай Романович: Не уверен на счёт нового стандарта, но в старом стандарте это не безразмерное поле, а массив фиксированного размера, но размер определяется правой частью. Либо массив нулевой длины, но от него смысла вообще минимум.
Николай Романович: Ну так это вы просто не правильно с памятью работаете. Выделяете не структуру с массивом в 100500 байт, а выделяете 100500 структур размером sizeof(SomeStruct). Её размер как минимум 4 байта (размер someArray[] может варьироваться в зависимости от 100500 факторов). Т.е. выделяете памяти минимум в четыре раза больше, чем хотите, а потом делаете вид, что это new кривой и не позволяет писать неадекватную чушь.)
Николай Романович: Я прав, а malloc вообще не выделяет структур, он выделяет блок байт. somaArray[] содержит адрес пустого массива. Пытаясь его индексировать, вы обращаетесь к памяти ЗА пределами структуры. Размер структуры равен sizeof(int) + sizeof(someArray[]) + возможное выравнивание. Ни о каких 100500 и речи быть не может.
Такая путаница ещё раз подтверждает, что в 99.99% случаев лучше забыть про malloc, т.к. понять его работу гораздо сложнее, чем new.
Я конечно извиняюсь, но советую вам погуглить насчет 0-size arrays. В данном случае нично не мешает оращаться к памяти за пределами структуры (но не за пределами выделенного блока !!!), на этом и основана данная "фича" языка.
Николай Романович: Это не "фича", а некорректное использование. Поменяйте местами int и char[] и будет очень весело. Опять же, нельзя нарисовать два "нулевых" массива в одной структуре. Это ужаснейший косяк языка, позволяющий говнокодить.
Николай Романович: Согласен, был не прав, это не UB. Это стандартизированный сишный костыль.) Будет весело написать такое на С++ и использовать такую структуру в качестве базового класса при множественном наследовании.
И я не заметил, что в malloc суммирование, а не умножение на sizeof(), так что перерасхода памяти и правда нет.
Никто же не предлагает наследоваться от такой структуры. Такое расширение вообще обычно не используется. Но это очень удобно при хранении данных, где оно и используется.
Ринат Велиахмедов: В Сишке нет std::vector, а эта структура позволяет хранить длину массива и указатель на него совместно. Костыль для тех, кто не умеет в vector.)
Я бы выпилил такую запись из стандарта с громкими ругательствами.