LINUX.ORG.RU

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


0

0

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


★★★★

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

если в смысле того, что реально поставлены страницы - то нет..

MKuznetsov ★★★★★ ()

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

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

asgard ()

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

такое поведение -- без реального выделения -- происходит в случае если память выделяется но ты ее не касаешься. В случае Си++ как правило ты будешь выделять классы с нетривиальным конструктором.

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

dilmah ★★★★★ ()
Ответ на: Re: различия в поведении new и malloc от dilmah

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

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

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

Dead ★★★★ ()
Ответ на: Re: различия в поведении new и malloc от Dead

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

> Есть мнение, что при работе с простыми типами, например, new char[1000]. Проверка на то, что память была реально выделена, не проводится.

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

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

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

dilmah ★★★★★ ()
Ответ на: Re: различия в поведении new и malloc от olegk

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

>Это не то?

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

Dead ★★★★ ()
Ответ на: Re: различия в поведении new и malloc от Dead

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

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 ★★ ()
Ответ на: Re: различия в поведении new и malloc от olegk

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

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

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

overcommit memory в гугле

dilmah ★★★★★ ()

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

Тебе же ссылку кинули. Exception поймаешь bad_alloc.

x-term ★★ ()
Ответ на: Re: различия в поведении new и malloc от Dead

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

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

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

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

anonymous ()
Ответ на: Re: различия в поведении new и malloc от Dead

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

> Интересно было бы посмотреть где это поведение задокументировано.

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

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