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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.