-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
template<typename T>
void CMyArray<T>::Resize(size_t newSize)
{
size_t currentSize = GetSize();
size_t oldSize = GetSize();
auto endBackup = m_end;
if (newSize < currentSize)
{
DestroyItems(m_begin + newSize, m_end);
m_end = m_begin + newSize;
}
while (newSize > currentSize)
{
try
{
Append(T());
}
catch (...)
{
if (currentSize > oldSize)
{
DeleteItems(endBackup, endBackup + (currentSize - oldSize));
m_end = endBackup;
}
throw;
}
currentSize++;
}
}
-
Возможно непределенное поведение при выбросе исключения. endBackup может начать указывать на не принадлежащий массиву адрес памяти, если в предыдущих вызовах Append произошло перевыделение памяти.
-
Сделайте так: рассмотрите 3 ситуации:
- уменьшаем размер (это уже сделано)
- увеличиваем размер, но не вместимость
- увеличиваем размер и вместимость
Обеспечить строгую гарантию безопасности исключений во всех трех ситуациях (при условии, что конструкторы T обеспечивают строгую гарантию безопасности, либо не бросают исключение)
Metadata
Metadata
Assignees
Labels
No labels