Информация о типах во время выполнения в C++

Да, OOM является восстанавливаемым. Как экстремальный пример, Unix и операционные системы Windows восстанавливаются вполне приятно с условий OOM большую часть времени. Сбой приложений, но ОС выживает (предполагающий, что существует достаточно памяти для ОС для надлежащего запуска во-первых).

я только привожу этот пример, чтобы показать, что он может быть сделан.

проблема контакта с OOM действительно зависит от Вашей программы и среды.

, Например, во многих случаях место, где OOM происходит, скорее всего, НЕ является лучшим местом для фактического восстановления с состояния OOM.

Теперь, пользовательское средство выделения могло возможно работать центральной точкой в коде, который может обработать OOM. Средство выделения Java выполнит полный GC, прежде чем будет, на самом деле выдает исключение OOM.

, Чем больше "приложения, знающего", что Ваше средство выделения, тем лучше подходящий это было бы как центральный обработчик и агент восстановления для OOM. Используя Java снова, это - средство выделения, не особенно знающее приложение.

Это - то, где что-то как Java с готовностью печально. Вы не можете переопределить средство выделения. Так, в то время как Вы могли захватить исключения OOM в своем собственном коде, нет ничего, говоря, что некоторая библиотека, которой Вы пользуетесь, правильно захватывает, или даже правильно ВЫДАЕТ исключение OOM. Это тривиально для создания класса, который навсегда разрушен исключением OOM, поскольку некоторый объект устанавливается в NULL и, "которых никогда не происходит", и это никогда не восстанавливаемо.

Так, да, OOM является восстанавливаемым, но это может быть ОЧЕНЬ твердо, особенно в современных средах как Java, и это - изобилие сторонних библиотек различного качества.

5
задан josephthomas 22 April 2012 в 09:51
поделиться

5 ответов

Он позволяет вам определять динамический тип объекта во время выполнения. Например:

class A
{
   virtual ~A();
};

class B : public A
{
}

void f(A* p)
{
  //b will be non-NULL only if dynamic_cast succeeds
  B* b = dynamic_cast<B*>(p);
  if(b) //Type of the object is B
  {
  }
  else //type is A
  { 
  }
}

int main()
{
  A a;
  B b;

  f(&a);
  f(&b);
}
4
ответ дан 13 December 2019 в 05:38
поделиться

Это касается не только dynamic_cast, но и всего RTTI является его частью. Лучшее место для изучения RTTI - это раздел 15.4 языка программирования C ++ Бьярна Страуструпа

4
ответ дан 13 December 2019 в 05:38
поделиться
2
ответ дан 13 December 2019 в 05:38
поделиться

Функциональность dynamic_cast - ваш код может обнаружить во время выполнения если данный указатель или ссылка действительно привязаны к объекту ожидаемого типа.

2
ответ дан 13 December 2019 в 05:38
поделиться

Вы можете взять интерфейс * и «спросить» c ++, на какой тип объекта указывает указатель. Насколько мне известно, это зависит от метаинформации времени выполнения, для которой требуется несколько циклов. для хранения и поиска такой информации.

Посмотрите на ключевое слово typeid. Он обеспечивает максимум волшебства.

только dynamic_cast использует RTTI, typeid с std :: type_info мне кажется, больше похоже на "настоящую вещь".

0
ответ дан 13 December 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: