LINUX.ORG.RU

различия в поведении new и malloc


0

0
Приветствую.
Интересует такой вопрос.
Как известно в linux по умолчанию malloc вернувший не NULL не гарантирует то, что память действительно выделилась.
Гарантирует ли это оператор new в С++?


★★★★
если в смысле того, что реально поставлены страницы - то нет..
MKuznetsov ★★★★★
()
нет, стратегия-то у всех user-space алокаторов одинаковая: есть куча, запрашиваемая mmap'ом и растущая с помощью sbrk, соответсвенно все запросы из юзерспейся по увеличению кучи проходят через ядро, которое точно так же не гарантирует, что сможет за фиксированное время размапить блок памяти нужного размера.
asgard ★
()
такое поведение -- без реального выделения -- происходит в случае если память выделяется но ты ее не касаешься. В случае Си++ как правило ты будешь выделять классы с нетривиальным конструктором.

Например в типичном случае ты будешь выделять массив полиморфных классов, где каждый объект меньше страницы -- как минимум будет проинициализирован vtable -- значит каждая страница будет прикоснута.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah
Есть мнение, что при работе с простыми типами, например, new char[1000]. Проверка на то, что память была реально выделена, не проводится.
Но в случае классов это гарантируется.

P.S. Далеко не в каждом классе есть vtable... Как я понимаю чтобы была таблица, необходимо чтобы класс содержал виртуальные методы или был базовым.
Dead ★★★★
() автор топика
Ответ на: комментарий от Dead
> Есть мнение, что при работе с простыми типами, например, new char[1000]. Проверка на то, что память была реально выделена, не проводится.

с простыми типами да

> P.S. Далеко не в каждом классе есть vtable... Как я понимаю чтобы была таблица, необходимо чтобы класс содержал виртуальные методы или был базовым.

ну я ж специально написал -- полиморфные классы

dilmah ★★★★★
()
Ответ на: комментарий от dilmah
Интересно было бы посмотреть где это поведение задокументировано.
В том же malloc это в явном виде прописано в man'е.
Гуглил... Ненашел.
Dead ★★★★
() автор топика
Ответ на: комментарий от olegk
>Это не то?

Прошу прощения, не нашел там ничего о том, что new не гарантирует выделена память или нет. Собственно это поведение платформо зависимо.

Dead ★★★★
() автор топика
Ответ на: комментарий от Dead
In this case, if the allocation of this block of memory failed, the failure could be detected by checking if bobby took a null pointer value.

Отсюда очевидно, что не гарантирует или я не понимаю о чем речь?

И отловить можно все это либо проврив на NULL или с помощью exception.

olegk ★★
()
Ответ на: комментарий от olegk
> Отсюда очевидно, что не гарантирует или я не понимаю о чем речь?

не понимаешь..

overcommit memory в гугле

dilmah ★★★★★
()
Тебе же ссылку кинули. Exception поймаешь bad_alloc.
x-term ★★
()
Ответ на: комментарий от Dead
>Есть мнение, что при работе с простыми типами, например, new char[1000]. Проверка на то, что память была реально выделена, не проводится. >Но в случае классов это гарантируется.

А если в классе есть member типа char[1000]?

На самом деле, никаких гарантий new <некий_тип> не дает, если в конструкторе некоего_типа не выполняется какой-либо инициализации.

anonymous
()
Ответ на: комментарий от Dead
> Интересно было бы посмотреть где это поведение задокументировано.

В стандарте cpp... :)

anonymous
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.