Я просто проверяю оператор на предмет «удалить это». С системным вызовом дескриптора «new / delete» будет потерян один вызов функции удаления перезаписи.
Функция дескриптора имеет вид:
inline void* operator new(size_t size)
{
void* p = ::malloc( size );
fprintf( stderr, "new size %ld: %p\n", size, p );
return p;
}
inline void* operator new[]( size_t size )
{
void* p = ::malloc( size );
fprintf( stderr, "new size[] %ld: %p\n", size, p );
return p;
}
inline void operator delete(void* p)
{
fprintf( stderr, "delete: %p\n", p );
::free(p);
}
inline void operator delete[](void* p)
{
fprintf( stderr, "delete []: %p\n", p );
::free(p);
}
и тестовый класс:
class A
{
public:
A() : a(NULL)
{
printf( "A construct\n" );
a = new int[100];
}
~A()
{
printf( "A destruct \n" );
freeA();
}
void freeA()
{
if ( a ) { delete [] a; a = NULL; }
}
void release()
{
delete this;
}
private:
int* a;
};
Когда я звоню
A* a = new A();
a->release();
В результате:
new size 8: 0x5642fc1c4e70
A construct
new size[] 400: 0x5642fc1c52a0
A destruct
delete []: 0x5642fc1c52a0
отсутствует вызов удаления о A (0x5642fc1c4e70),почему?