【发布时间】:2019-07-10 06:36:45
【问题描述】:
我只是测试了关于“删除这个”的操作符。使用句柄系统调用“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) 的删除调用,为什么?
【问题讨论】:
-
你忘记给
freeA打电话了吗? -
@melpomene 我认为这是最小的可重现示例。
-
@BartekPL 不是:ideone.com/P93JmR
-
如果你使用了ideone页面,那么你只需要使用its template ;)
-
对不起。我刚刚发现了问题:使用内联,运算符 delete(void* p) 根本无法调用。但是 delete[](void* p) 可以。
标签: c++ delete-operator