2012-05-04 2 views
6

Является ли новый оператор гарантией выделение непрерывной кучи памяти кучи? То есть являетсяC++ новый оператор - макет памяти

objects=new Base[1024]; 

с точки зрения распределения памяти так же, как

objects=(Base*)malloc(1024*sizeof(base)); 

или же может быть пробелы?

ответ

8

Да, память будет непрерывной. С точки зрения распределения, это то же самое, что и версия malloc, но есть несколько отличий (призыв к конструктору, new не возвращается NULL, malloc не генерирует исключений и т. Д.).

Обратите внимание, что вы не можете смешивать new[] с delete или free, вы должны использовать delete[] objects, чтобы освободить память.

+0

Это не совсем то же самое. 'New []' version будет вызывать конструктор по умолчанию для каждого объекта. –

+1

@ edA-qamort-ora-y вот что я сказал ... –

+0

Извините, сегодня я слепой. Однако новая версия выделяет немного места для запоминания размера массива, поэтому 'delete []' может вызывать правильное количество деструкторов. Это, конечно, незначительная разница в пространстве. –

3

Возможно. Оператор new выполняет две функции: он называет функцию operator new, которая будет возвращать непрерывный блок памяти, адекватно выровненный для всех возможных типов (за исключением случаев, когда это не так, например, неправильно используемое размещение нового); он затем вызывает конструктор объекта, который может делать что угодно. Включая выделение дополнительных блоков, которые не будут соприкасаться с первым.

0

Если оператор new не перегружен, да, выделенный блок памяти смежный. Но если он перегружен, мы не можем знать (некоторые программисты-программисты могли его перегружать?: D)

Смежные вопросы