Сравните два способа объявления массива - PullRequest
1 голос
/ 30 ноября 2011
int buf1[] = {0,0,0,0,0};

int* buf2 = new int[5]; //assume every element is initialzed to 0 as well

Единственное различие, о котором я могу думать, это то, что buf1 - это ссылка на массив, а buf2 - указатель на массив. Другими словами, buf1 всегда ссылается на массив, а buf2 может указывать и на другие места.

Кроме упомянутого, есть ли другое различие между двумя способами объявления (и инициализации массива)?

Ответы [ 5 ]

9 голосов
/ 30 ноября 2011

buf1 - автоматический объект (или статический, если он находится в глобальной области видимости);*buf2 - это динамический объект.То есть время жизни buf1 контролируется автоматически, а время жизни *buf2 - ваше.(buf2 живет до тех пор, пока вы не скажете что-то вроде delete[] buf2;.)

Инициализаторы тоже разные;buf1 инициализируется скобками, а *buf2 инициализируется по умолчанию (т.е. его элементы int неинициализированы).

3 голосов
/ 30 ноября 2011

В первом случае:

  • используется автоматическое (в области действия функции) или статическое (в области пространства имен)
  • вы инициализировали значения для всех нулей

Во втором случае:

  • используется динамическое выделение (и вам придется delete [] позже)
  • Массив неинициализирован
2 голосов
/ 30 ноября 2011
int buf1[] = {0,0,0,0,0};

Это дает автоматическое хранилище, если оно находится в блоке, или статическое хранилище, если оно находится в пространстве имен. В первом случае это будет продолжаться до тех пор, пока программа не покинет блок, внутри которого она объявлена; во втором - до выхода из программы.

int* buf2 = new int[5];

Это создает массив динамически; у вас есть контроль над его временем жизни, и оно продолжается до тех пор, пока вы его не удалите (delete [] buf2). Если вы не удалите его, то произойдет утечка памяти, чего следует избегать. Чтобы гарантировать правильное удаление динамических объектов, лучше не управлять ими напрямую с помощью необработанного указателя, но следует использовать класс RAII , такой как интеллектуальный указатель или контейнер, для управления им за вас.

1 голос
/ 30 ноября 2011

Помимо того, что вы должны очистить (удалить) свою вторую версию?И что первая и вторая версии будут размещены в разных областях оперативной памяти?И что первый может занять немного больше исполняемого пространства, если эти 0 хранятся вместо сгенерированных?Или что вторая версия даже прояснит, что ОЗУ для вас 0, что, я не верю, будет.

Они очень разные.

1 голос
/ 30 ноября 2011

Если вы объявите int buf1 [] = {0,0,0,0,0};в функции после выхода из нее массив будет уничтожен.Во втором случае вы должны вручную удалить массив после того, как вы закончите его использовать, например, delete [] buf2, но таким образом он не будет уничтожен автоматически, поэтому вы можете использовать его везде, пока не удалите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...