int buf1[] = {0,0,0,0,0};
Это дает автоматическое хранилище, если оно находится в блоке, или статическое хранилище, если оно находится в пространстве имен. В первом случае это будет продолжаться до тех пор, пока программа не покинет блок, внутри которого она объявлена; во втором - до выхода из программы.
int* buf2 = new int[5];
Это создает массив динамически; у вас есть контроль над его временем жизни, и оно продолжается до тех пор, пока вы его не удалите (delete [] buf2
). Если вы не удалите его, то произойдет утечка памяти, чего следует избегать. Чтобы гарантировать правильное удаление динамических объектов, лучше не управлять ими напрямую с помощью необработанного указателя, но следует использовать класс RAII , такой как интеллектуальный указатель или контейнер, для управления им за вас.