Динамическое размещение в C ++ с использованием 'new' - PullRequest
1 голос
/ 31 января 2011

Бит смущен использованием нового для динамического выделения памяти.

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

int *ptr = new int[100];

или

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

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

РЕДАКТИРОВАТЬ:

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

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

int *arr = new int [100][4];

спасибо.

-AD

Ответы [ 2 ]

4 голосов
/ 31 января 2011

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

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

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


Вы пробовали код в обновлении?

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

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

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

1 голос
/ 31 января 2011

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

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

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

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

вместо:

int *ptr = new int[100];

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

...