Как уже упоминалось, std::vector
- это, как правило, путь. Причина в том, что вектор очень хорошо понятен, он стандартизирован для всех компиляторов и платформ, и, прежде всего, он защищает программиста от трудностей ручного управления памятью. Более того, векторные элементы должны выделяться последовательно (то есть, векторные элементы A, B, C будут отображаться в непрерывной памяти в том же порядке, в каком они были введены в вектор). Это должно сделать вектор как кэш-совместимым, как обычный динамически распределенный массив.
Хотя тот же конечный результат определенно может быть достигнуто путем объявления указатель на Int и вручную управлять памятью, это будет означать дополнительную работу:
- Каждый раз, когда вам нужно больше памяти, необходимо вручную выделить его
- вы должны быть очень осторожны, чтобы удалить все ранее выделенную память перед назначением нового значения указателя, чтобы вы застряли с огромной утечкой памятью
в отличии от std::vector
, этот подход не RAII содружественными. Рассмотрим следующий пример:
void function()
{
int* array = new int[32];
char* somethingElse = new char[10];
// Do something useful.... No returns here, just one code path.
delete[] array;
delete[] somethingElse;
}
Это выглядит в целости и сохранности. Но это не так. Что делать, если при попытке выделить 10 байтов для «somethingElse», у системы заканчивается память? Будет выбрано исключение типа std::bad_alloc
, которое начнет разворачивать стек, ищущий обработчик исключений, пропускает инструкции удаления в конце функции. У вас есть утечка памяти. Это лишь одна из многих причин избежать ручного управления памятью на C++. Чтобы исправить это (если вы действительно это действительно хотите), библиотека Boost предоставляет кучу красивых оберток RAII, таких как scoped_array и scoped_ptr.
Вы просто не знаете размер или еще вы знаете размер только после того, как вы что-то прочитали во время выполнения? То есть это размер постоянной времени компиляции? Есть более простые способы решить эту проблему, чем использовать новые или векторы в этом случае. –
По вашему мнению, вы согласились, что, похоже, вы не думаете, что 'std :: vector' будет работать для вас. Почему это? – SingleNegationElimination