Простое указание std::vector
выделить часть памяти в operator new
должно сделать это:
void *operator new(std::size_t size) {
// std::vector<int>::reserve calls std::allocator<int>::allocate calls (this) operator new calls ...
std::vector<int>().reserve(999);
return std::malloc(size);
}
int main() {
int *p = new int(42);
// OFC, this is undefined behavior, so we *could* reach this, but... we don't, which means it definitely is UB
std::cout << "Shouldn't reach this!\n";
}
Godbolt показывает, что он падает
Обратите внимание, что a) Недостаточно просто построить std::vector
, потому что он может не распределяться. std::vector
обычно выделяется только тогда, когда вы как-то об этом говорите. Он будет расширяться, когда вы попытаетесь что-то добавить к нему, или вы можете сказать «будь хотя бы таким большим» с помощью reserve
. б) Вы должны откуда-то позвонить operator new
, чтобы вызвать l oop (здесь это в new
в main
).