C ++ является асимметричным размещения новых и удаления размещения.Нам разрешено перегружать размещение новых практически произвольными способами.Однако функции удаления размещения только вызываются из новых выражений размещения.В частности, они вызываются, если конструктор объекта выдает исключение.Нет никакого способа вызвать удаление размещения для кода приложения вообще.
У меня есть следующие недоразумения и вопросы, которые необходимо уточнить:
1) Почему компилятор C ++ не может просто отклонить сигнатуру нового метода размещения размещенияесли не определено место размещения, удалить дубликат?Это может помочь убить возможности утечки памяти в этом контексте.
2) Если у меня есть несколько пулов памяти (управляемых кодом приложения), и я хочу другое размещение, новое для выделения памяти из разных пулов, просто нетспособ поддержать это из-за того, что нет никакого способа узнать, из какого пула памяти пришел указатель в операторе delete?(оператор удаления имеет только void * info).Есть ли способ, которым я могу сделать это в C ++?
struct Node {
void* operator new(size_t size, Strategy s) {
// Depend on different strategy, allocate memory
// from different Memory pool
}
void operator delete(void* memory, Strategy s) {
// Return the memory to different Memory pool
// depends on the Strategy
// However this delete will only be invoked by
// c++ runtime if Node constructor throws.
}
void operator delete(void* memory, size_t s) {
// This delete doesn't have any clue about the
// the strategy. Hence, it can't decide which
// Memory pool to return to.
}
}
3) В контексте размещения new среда выполнения C ++ будет вызывать размещение delete с тем же аргументом.Как среда выполнения C ++ достигает этого?