При чтении ответов на этот вопрос я заметил, что ответы (this) подразумевают, что operator delete
можно вызывать, даже если оператор delete
выполняется с нулевым указателем.
Итак, я написал небольшой фрагмент:
class Test {
public:
void* operator new( size_t ) { /*doesn't matter*/ return 0; }
void operator delete( void* ptr ) {
ptr; //to suppress warning and have a line to put breakpoint on
}
};
int main()
{
Test* ptr = 0;
delete ptr;
}
и - неожиданно для меня - Test::operator delete()
вызывается с ptr
с нулевым указателем.
Как я понимаю, operator new
выделяет память, а operator delete
возвращает память в распределитель. Если я вызываю оператор delete
на нулевом указателе, это означает, что за указателем не было объекта и нет памяти для возврата в распределитель.
delete
включает вызов деструктора. Когда я передаю нулевой указатель, деструктор, безусловно, не вызывается - С++ позаботится об этом. Тогда почему в этом случае вызывается operator delete
?