有没有什么好的理由(除了"宏是邪恶的",也许)不使用以下宏?
#define DELETE( ptr ) \
if (ptr != NULL) \
{ \
delete ptr; \
ptr = NULL; \
}
#define DELETE_TABLE( ptr ) \
if (ptr != NULL) \
{ \
delete[] ptr; \
ptr = NULL; \
}
Run Code Online (Sandbox Code Playgroud) 在阅读这个问题的答案时,我注意到答案(例如这个)意味着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;
}
Run Code Online (Sandbox Code Playgroud)
并且 - 令我惊讶的是 - Test::operator delete()通过ptr持有空指针来调用.
据我所知,它operator new分配内存operator delete并将内存返回给分配器.如果我delete在空指针上调用语句,则意味着指针后面没有对象,并且没有内存返回到分配器.
delete语句包括调用析构函数.当我传递一个空指针时,肯定不会调用析构函数--C++会处理这个问题.那么为什么operator delete在这种情况下被调用?
可能重复:
删除前在C++中测试void指针
代码段1是否等效于代码段2?
//Snippet 1:
delete record;
record = new Record;
//Snippet 2
if (record != NULL)
{
delete record;
record = NULL;
}
record = new Record;
Run Code Online (Sandbox Code Playgroud)