Skip to content

Замечания по CMyArray #16

@alexey-malov

Description

@alexey-malov
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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions