C++ асимметричен по размещению new и размещению delete. Нам разрешено перегружать размещение new почти произвольным образом. Однако функции удаления места размещения только вызываются из новых выражений места размещения. В частности, они вызываются, если конструктор объекта выдает исключение. Нет никакого способа вызвать удаление размещения для кода приложения вообще.
У меня есть следующие путаницы и вопросы, которые необходимо уточнить:
1) Почему компилятор С++ не может просто отклонить сигнатуру нового метода размещения, если не определен аналог удаления размещения? Это может помочь убить возможности утечки памяти в этом контексте.
2) Если у меня есть несколько пулов памяти (управляемых кодом приложения), и я хочу, чтобы новое размещение выделяло память из разных пулов, просто нет возможности поддерживать это из-за того, что нет способа узнать, какой пул памяти указатель пришел из оператора удаления? (оператор delete имеет только информацию о void*). Есть ли способ сделать это на С++?
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) В контексте нового размещения среда выполнения C++ вызовет удаление размещения с тем же аргументом. Как среда выполнения C++ выполняет это?
T* p = new (memory) T();
, разве вы не должны делатьp->~T();
? Что такое место размещенияdelete
? - person jamesdlin   schedule 31.05.2019new
, являются заменяемыми, поэтому пользователь может управлять выделением (и/или отлаживать его) - person M.M   schedule 31.05.2019delete
, на мой взгляд, плохо. Единственное решение, которое я знаю, это полностью избегать использования оператора new/delete (кроме размещения new) и запускать свою собственную систему. - person geza   schedule 31.05.2019Foo *f = new(myAllocator) Foo(a, b, c);
используйтеFoo *f = myAllocator->allocate<Foo>(a, b, c);
, а вместоdelete
используйтеmyAllocator->free(f);
. - person geza   schedule 01.06.2019