Согласно документации C++, оператор new/etc. функции:
неявно объявлены в каждой единице перевода[, и т]программа неправильно сформирована [...], если предусмотрено более одной замены в программе для любой из заменяемых функций распределения.
То есть, если программист не определяет собственный оператор new, то стандартная библиотека C++ должна И наоборот, если они предоставляют, то стандартная библиотека не должна.
Я это понимаю. поведение, но чего я не понимаю, так это того, как это работает на уровне компоновщика.
Стандартная библиотека C++ компилируется до программы, которая использует его, и именно здесь программист решает, определять ли свой собственный оператор new. Таким образом, стандартная библиотека C++ действительно должна где-то предположительно предоставлять оператор new. Но затем, когда программа пользователя скомпонована со стандартной библиотекой, если они определили свою собственную функцию распределения, тогда это приведет к множественным определениям и противоречит приведенной выше документации (на практике, слава богу, вы получаете ошибку компоновщика о повторяющихся символах).
И наоборот, если стандартная библиотека не определяет оператор new, то, конечно, пользователю придется это сделать, иначе любой его вызов приведет к отсутствию символов (и, следовательно, к ошибке компоновщика в другую сторону).
Подробнее здесь: https://stackoverflow.com/questions/779 ... nker-level