Если вам нужен непрерывный буфер, используйте vector.
std::vector<int> buf;
buf.push_back( 1 );
buf.push_back( 2 );
buf.push_back( 3 );
int * intbuf = &buf[0];
Остерегайтесь, этот указатель может быть признан недействительным, если вы добавите больше элементов в ваш вектор. Вы можете предотвратить это, если захотите, сделав это сначала:
buf.reserve( 65536 );
или какой-то другой номер. Вы все еще можете добавить более 65536 элементов в вектор, но гарантируется, что до тех пор, пока размер меньше этого, & buf [0] не изменится.
Учитывая, что вы ничего не делаете, вы пытаетесь реализовать вектор, один из способов сделать это - вообще не использовать new, а использовать malloc для выделения памяти, таким образом:
char * buf = static_cast<char *>( malloc( BUF_SIZE ) );
Теперь вы можете создавать объекты здесь с размещением новых
int * intbuf = new( buf + sizeof(int) * N ) int( i );
Когда вам нужно больше места, вы можете «перераспределить» указатель. Сначала убедитесь, что перераспределены временные, чтобы убедиться в их успешности.
bufNew = static_cast< char * >( realloc( buf, newBufSize ) );
if( bufNew )
buf = bufNew;
Это работает здесь, потому что int является типом POD. Если тип не POD, перераспределение и перемещение объектов по памяти небезопасно, вам нужно переместить их как объекты, используя operator = для каждого из них.
Теперь вы немного знаете об этом, но для практических целей вы, вероятно, захотите использовать вектор.