2011-01-31 4 views
1

Бит путают в использовании нового для динамического выделения памяти.Динамическое выделение в C++ с использованием «нового»

например. Если мне нужно выделить память для 100 Интса (при условии, ИНТ 4 байта), я должен сказать:

int *ptr = new int[100]; 

или

int *ptr = new int[100*4]; //assuming int is 4 bytes. 
  1. Basially новый оператор выделяет память в байтах или что много байт типа T, используемого при вызове нового оператора?

  2. Если у моего класса нет функции-члена распределителя, & Мне нужно выделить массив объекта этого типа, будет ли новый oeprator найти sizeof (тип класса) и соответственно распределить или как это сделать Работа?

EDIT:

Извините за складчину несколько вопросов, но связанные с ним:

будет этот кусок кода отлично работает, если я хочу выделить 2D массив размером [100] [4] от ints

спасибо.

-AD

ответ

4

Размер уделено новым является количество элементов, не размер памяти. Однако рассмотрите вместо этого использование std :: vector.

Например, new int[100] выделяет не менее 100 * sizeof(int) байт (это 400, когда sizeof (int) равно 4); более того, он выделяет будет из-за выполнения и деталей выполнения, которые вы (за исключением очень редко) не могут зависеть.

Если у вас нет оператора new или оператора new [] в вашем классе (которого обычно не требуется), тогда будут использоваться глобальные версии, и они будут правильно использовать sizeof (your_type).


Вы были try the code in the update?

Многомерные массивы на самом деле являются массивами массивов; так что новые возвращает указатель на первый элемент так же, как это делает для одномерных массивов, который является указателем на массив:

typedef int int4[4]; // for clarity 
int4 *arr = new int4[100]; 
// above two lines are identical to: 
int (*arr)[4] = new int[100][4]; 

Опять же, вы почти всегда лучше использовать контейнер, чем управлять этим самостоятельно. Это вектор, et. а также контейнеры, такие как boost :: array и выделенные «матричные» типы для «квадратных» двумерных массивов.

+0

@Fred: Спасибо за быстрый ответ. Поскольку мой код orignal представляет собой смесь C + C++ (80%/20%), и, откровенно говоря, не очень хорошо разбирался в C++ как C. На самом деле не думал об этом. Но можете ли вы указать пример короткого тестового кода для использования std :: vector? – goldenmean

+0

@goldenmean: Лучше этого я могу указать на несколько: см. * Ускоренный C++ *, * Программирование: принципы и практика с использованием C++ * или [другие] (http://stackoverflow.com/q/388242). –

+0

будет ли эта часть кода работать нормально, если я хочу выделить 2D-массив размера [100] [4] из ints: int * arr = new int [100] [4]; – goldenmean

1

Путаница может возникнуть из-за malloc, которая использует размер данных, а не количество элементов.Для того, чтобы выделить массив из 100 чисел, вы можете сделать:

int *ptr = (int *)malloc(100 * 4); 

или (лучше, работает на всех платформах, потому что int не всегда 4 байта в длину):

int *ptr = (int *)malloc(100 * sizeof(int)); 

вместо:

int *ptr = new int[100]; 

который, как говорит Фред, автоматически использует размер данных для выделения правильной области. Конечно, malloc может использоваться только для встроенных типов, таких как int.

+0

Malloc может использоваться для любого типа, но вам все равно нужно построить (а затем уничтожить и освободить) объект (ы). Malloc следует сравнивать с новым оператором (функцией с этим именем), а не с новым оператором. –

+0

Вы правы - вы действительно можете выделить место для любого типа, встроенного или нет (но выделенное пространство требует вызовов для правильной инициализации конструкторов, тогда как для встроенного типа область может быть использована сразу) , – Emmanuel

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