При чтении ответов на на этот вопрос я заметил, что ответы (например, на этом ) подразумевают, что 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
оператор включает в себя вызов деструктора. Когда я передаю нулевой указатель, деструктор, безусловно, не вызывается - C ++ позаботится об этом. Тогда почему operator delete
вызывается в этом случае?