Что корректный путь состоит в том, чтобы обработать “из памяти”?

Это определяет который конвенция ссылки использовать. Большинство языков знает, как связаться с функцией стиля "C".

Вам нужно это в двух случаях:

  • А C - или другие языки в этом отношении программа, вызывающая функцию, записанную в C++
  • программа C++ А, вызывающая функцию, записанную в примере C

:

// declared in function.h
void f1(void);

Ваш код C - на самом деле другие языки в состоянии связаться с функцией C - не будет в состоянии связаться с ним, потому что имя в объектной таблице будет использовать конвенцию C++.

, Если Вы пишете

extern "C" void f1(void);

Теперь связывающиеся работы, потому что это использует конвенцию C.

7
задан skaffman 17 September 2009 в 16:49
поделиться

7 ответов

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

В операционных системах, поддерживающих сбои, я видел два общих шаблона:

  • Напишите специальную процедуру, которая проверяет результат malloc () и вызывает abort () в случае сбоя выделения. Например, библиотеки GLib и GTK + используют этот подход.

  • Храните глобальный список «очищаемых» выделений, таких как кеши, которые можно очистить в случае сбоя выделения. Затем попробуйте распределение еще раз, и, если это все еще не удается, сообщите об этом через стандартные механизмы сообщения об ошибках (которые не выполняют динамическое распределение).

12
ответ дан 6 December 2019 в 09:20
поделиться

Следуйте стандартизированному API

Даже в Linux можно использовать ulimit для получения быстрого возврата ошибки malloc. Просто по умолчанию установлено безлимитное.

Существует определенное давление, чтобы соответствовать опубликованным стандартам. В большинстве систем, в конечном итоге и даже в Linux, malloc (3) вернет правильное указание на сбой. Верно, что настольные системы имеют виртуальную память и требуют подкачки, но даже в этом случае отсутствие проверки malloc (3) работает только в отлаженной программе без утечек памяти. Если что-то пойдет не так, кто-то захочет установить ulimit и отследить его. Внезапно проверка malloc обретает смысл.

6
ответ дан 6 December 2019 в 09:20
поделиться

Использование результата malloc без проверки на null недопустимо в коде, который может быть открыт для использования на платформах, где malloc может дать сбой, на тех, где это приведет к сбоям и непредсказуемому поведению. Я не могу предвидеть будущее, не знаю, куда пойдет мой код, поэтому я бы написал код с проверками для malloc, возвращающего null - лучше умереть, чем вести себя непредсказуемо!

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

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

1
ответ дан 6 December 2019 в 09:20
поделиться

Это зависит от типа приложения, над которым вы работаете. Если приложение действительно делится на дискретные задачи, где отдельной задаче может быть разрешен сбой, тогда проверка выделения памяти может быть восстановлена ​​изящно.

Но во многих случаях единственный разумный способ отреагировать на сбой malloc - это завершив программу. Этого можно добиться, если позволить вашему коду просто рухнуть из-за неизбежного нулевого разыменования. Конечно, всегда было бы лучше выгрузить запись журнала или сообщение об ошибке, объясняющее ошибку, но в реальном мире мы работаем по ограниченному графику. Иногда окупаемость вложений в педантичную обработку ошибок отсутствует.

1
ответ дан 6 December 2019 в 09:20
поделиться

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

0
ответ дан 6 December 2019 в 09:20
поделиться

Зависит от приложения, которое вы пишете. Конечно, вам всегда нужно проверять возвращаемое значение malloc (). Однако изящная обработка OOM имеет смысл только в очень редких случаях, например, при низкоуровневых критических системных службах или при написании библиотеки, которая может быть ими использована. Следовательно, наличие оболочки malloc, которая прерывается при OOM, очень распространено во многих приложениях и фреймворках. Часто эти оболочки называются xmalloc () или аналогичными.

GLib g_malloc () также прерывается.

0
ответ дан 6 December 2019 в 09:20
поделиться

Если вы собираетесь обрабатывать огромное количество памяти, и хотите сделать для Linux такие утверждения, как «теперь у меня есть область памяти ABC, и мне не нужна часть B, делайте, как хотите», взгляните на семейство функций mmap () / madvise (), доступных на складе Библиотека GNU C. В зависимости от ваших шаблонов использования код может оказаться даже проще, чем использование malloc. Этот API также можно использовать, чтобы помочь Linux не тратить память на кеширование файлов, которые вы собираетесь читать / писать только один раз.

Они хорошо задокументированы в документации GNU libc info.

0
ответ дан 6 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

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