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