У меня есть смешанная программа на C/С++. Он содержит синтаксический анализатор flex/bison, который нацелен на C, а остальная часть - С++.
Будучи C, сгенерированный анализатор и сканер управляют своей памятью с помощью malloc
, realloc
и free
. Они достаточно хороши, чтобы выставлять крючки, позволяющие мне представить свои собственные реализации этих функций. Как и следовало ожидать, остальная часть программы (С++) "хочет" использовать new
, delete
и т.д.
Выполнение небольшого исследования, похоже, показывает, что соответствующие стандарты не гарантируют, что такое смешивание должно работать. В частности, C "куча" не обязательно является свободной областью С++. Кажется, что две схемы могут попирать друг друга.
Кроме того, когда-нибудь (скоро) эта программа, вероятно, захочет интегрировать индивидуальную реализацию кучи, такую как tcmalloc, используемая и C и С++.
Что такое "правильная" вещь здесь?
Учитывая желание интегрировать tcmalloc (который объясняет, как связываться с C-программами), я испытываю соблазн найти кросс-тип, кросс-нить, кросс-все перегрузку/крюк/что-то в управлении памятью С++. С этим я мог бы указать все вызовы выделения/релиза С++ обратно на их C-эквиваленты (которые, в свою очередь, приземляются на tcmalloc.)
Существует ли такой пангалактический глобальный С++-крючок? Возможно, он уже делает то, что я хочу, подобно тому, как ios_base::sync_with_stdio
по умолчанию закрывает iostream и stdio?
Мне не интересно говорить о stdio vs. iostreams, а также о переключении генераторов парсера и использовании скелетов С++ flex/bison (они вводят независимые головные боли.)
EDIT. Пожалуйста, укажите имена тех разделов стандарта С++, которые поддерживают ваш ответ.