Вы можете перегрузить глобальные операторы new
и delete
, чтобы вызвать новые версии malloc
и free
, которые вы используете.Это должно сделать вещи более приятными вместе, хотя я был бы удивлен, если бы это еще не произошло.
Что касается создания мьютекса, используйте размещение нового - это то, как конструктор вызывается вручную.Статический массив char
будет выполняться через буфер.Например, глобальные переменные:
static char buf[sizeof(Mutex)];
static Mutex *m=0;
Затем для инициализации указателя m
:
m=new(buf) Mutex;
(Вы также можете выровнять указатель и т. Д., Если необходимо, ипереименуйте переменные и т. д.)
Одна вещь, на которую стоит обратить внимание: если конструктор Mutex
сам выделяет больше памяти, это может быть проблемой.Это маловероятно, но возможно.(В этом, вероятно, редком случае, обычно нет проблем со специальной реализацией кроссплатформенной оболочки мьютекса, которая не выполняет никакого выделения - или, хотя это в конечном итоге приведет к путанице,просто используйте #ifdef
и используйте типы платформ напрямую. В любом случае, это не так много кода, и любой, имеющий опыт работы с рассматриваемой системой (-ами), может создать соответствующий код без ошибок за очень короткое время.)
Правильная очистка объектов, созданных таким способом, может быть сложной, поэтому я рекомендую не беспокоиться (нет, серьезно).Вполне нормально, чтобы этот материал просочился, когда вы используете его для реализации менеджера памяти;нет смысла сходить с ума по этому поводу.(Если вы работаете в системе, которая имеет представление о выходе из процесса, ОС в значительной степени гарантированно очистит базовый мьютекс для вас.)