Обработка ошибок при выделение памяти с помощью new в C++

Есть два способа определить выделена ли память оператором new.

Способ 1. Обработка исключения

Если память не выделена, то бросается исключение std::bad_alloc.

Пример обработки исключения.

// bad_alloc example
#include <iostream>     // std::cout
#include <new>          // std::bad_alloc

int main () {
  try
  {
    int* myarray= new int[10000];
  }
  catch (std::bad_alloc& ba)
  {
    std::cerr << ba.what() << std::endl;
  }
  return 0;
}

Способ 2. Проверка указателя

При вызове new в качестве аргумента можно использовать константу std::nothrow. Тогда, исключение std::bad_alloc не испускается, а вместо него возвращается нулевой указатель.

Пример обработки нулевого указателя.

// nothrow example
#include <iostream>     // std::cout
#include <new>          // std::nothrow

int main () {
  std::cout << "Attempting to allocate 1 MiB... ";
  char* p = new (std::nothrow) char [1048576];

  if (!p) {
    std::cout << "Failed!\n";
  }
  else {
    std::cout << "Succeeded!\n";
    delete[] p;
  }

  return 0;
}

Ссылки

  1. Описание std::bad_alloc.
  2. Описание std::nothrow.
Реклама

Контроль версий для резервных копий

Системы контроля версий (СКВ) не годятся для резервного копирования (бэкапов).

Чтобы в этом убедится, достаточно сравнить функционал системы контроля версий и необходимый функционал для бэкапов.

Функционал СКВ:

  1. Сохранение.
  2. Совместная работа.
  3. Ветвление.
  4. Сравнение.
  5. Слияние.
  6. Разрешение конфликтов.

Необходимый функционал для бэкапов:

  1. Сохранение.
  2. Автоматичность.
  3. Периодичность.
  4. Восстановление.
  5. Распределенное хранение.

Как видим пересечение только в сохранение. СКВ, можно использовать для бэкапов, но ни периодичности, ни восстановления, контроль версий не обеспечит.

Две наиболее распространенные ошибки при создании бэкапа:

  1. Ручные бэкапы вместо автоматических и отсутствие периодичности.
  2. Отсутствие проверки бэкапа на возможность восстановления данных. Сюда же относится проверка факта периодичности создания бэкапа.

На этот счет есть популярная шутка:

Всех пользователей можно разделить на две группы: на тех, кто регулярно делает бэкапы и на тех, кто пока не начал их делать. Но есть еще третья группа — те, кто проверяет бекапы.