использование класса определенный set_new_handler

Я видел обзор Фабрики программного обеспечения: Собирая Приложения с Шаблонами, Модели, Платформы и Инструменты на блоге, говорящем также приблизительно Фабрика КСИ , я считал его, и я должен сказать, что эта книга - необходимость чтение. Altough не конкретно был нацелен программистам, он объясняет очень ясно, что происходит в мире программирования прямо сейчас с Управляемой Моделью Архитектурой и так далее..

9
задан aJ. 25 August 2009 в 15:07
поделиться

3 ответа

Вы правы. Вероятно, это небезопасно для потоков. Возможно, вы захотите рассмотреть альтернативный подход, например, использовать вместо nothrow версию new :

void* X::operator new(std::size_t sz) {
  void *p;
  while ((p = ::operator new(sz, std::nothrow) == NULL) {
    X::new_handler();
  }
  return p;
}

Это вызовет ваш специфичный для класса обработчик при сбое выделения памяти. Я бы не стал этого делать, пока вы действительно не поймете всю головную боль, связанную с перегрузкой operator new . В частности, прочтите двухчастную статью Херба Саттера To New, Perchance To Throw, Part 1 и Part 2 . Достаточно интересно, что он говорит, что нужно избегать nothrow версии ... хммм.

4
ответ дан 3 November 2019 в 07:48
поделиться

C ++ (пока) не знает, что такое потоки. Вам придется обратиться к руководствам по вашему компилятору / стандартной библиотеке C ++ / операционной системе / библиотеке потоков, чтобы определить потокобезопасный способ сделать это или, если это вообще возможно. Я бы предположил, что новый обработчик, вероятно, должен быть одинаковым во всем приложении. Это не очень гибкий механизм, возможно, ваши потребности будут лучше удовлетворены с помощью распределителя или, возможно, фабрики (функции)? Что вы хотите сделать в новом пользовательском обработчике?

0
ответ дан 3 November 2019 в 07:48
поделиться

Возможно, вы неправильно на это смотрите. Я не думаю, что есть способ ограничить выделение памяти всему приложению (поскольку большая часть выделения памяти может находиться за пределами вашего кода), поэтому лучший способ сделать это - контролировать то, что вы можете, то есть реализацию обработчика.

Настройте обработчик для вызова экземпляра класса "OutOfMemoryHandler" (назовите его как хотите) в начале программы и по умолчанию для вызова существующего обработчика. Если вы хотите добавить обработку, специфичную для класса, добавьте поведение в свой OutOfMemoryHandler, используя ваши любимые методы C ++ для динамического поведения.

Это решение должно хорошо работать в однопоточной среде, но не сработает в многопоточной среде. Чтобы заставить его работать в многопоточной среде, вам необходимо, чтобы вызывающий объект уведомлял объект-обработчик о том, что он работает в определенном потоке; передача идентификатора потока с классом была бы хорошим способом сделать это. Если обработчик вызывается, он проверяет идентификатор потока и определяет поведение для выполнения на основе связанного класса. Когда вызов new () завершен, просто отмените регистрацию идентификатора потока, чтобы гарантировать правильное поведение по умолчанию (так же, как вы уже делаете при сбросе обработчика по умолчанию).

0
ответ дан 3 November 2019 в 07:48
поделиться
Другие вопросы по тегам:

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