Использование оператора delete
на объекте обычно приводит к двум вещам: вызов деструктора объекта (и его виртуальных деструкторов базы, если есть) и освобождение памяти впоследствии.
Если переопределить оператор delete
в классе, дающем ему пустую реализацию {}
, деструктор все равно будет вызываться, но память не освободится.
Предполагая, что деструктор также пуст, будет ли эффект delete
иметь какой-либо эффект или было бы безопасно продолжать использовать "удаленный" объект (т.е. существует ли поведение undefined)?
struct Foo {
static void operator delete(void* ptr) {}
Foo() {}
~Foo() {}
void doSomething() { ... }
}
int main() {
Foo* foo = new Foo();
delete foo;
foo->doSomething(); // safe?
}
Не то, чтобы это имело большой смысл, но я изучаю механизм "отложенного удаления" (gc), когда объекты не будут удаляться мгновенно, когда delete
будет вызван, но вскоре после этого.
Обновление
Ссылаясь на некоторые ответы, в которых упоминаются утечки памяти: допустим, что перегруженный оператор delete
не пуст, но сохраняет его аргумент ptr
в (скажем, статический, для простоты) set
:
struct Foo {
static std::unordered_set<void*> deletedFoos;
static void operator delete(void* ptr) {
deletedFoos.insert(ptr);
}
Foo() {}
~Foo() {}
}
И этот set
периодически очищается:
for (void* ptr : Foo::deletedFoos) {
::operator delete(ptr);
}
Foo::deletedFoos.clear();