相关疑难解决方法(0)

为什么不为C++提供DELETE宏的原因

有没有什么好的理由(除了"宏是邪恶的",也许)不使用以下宏?

#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)

c++ macros pointers memory-management

17
推荐指数
6
解决办法
8826
查看次数

当我在空指针上调用"delete"时,为什么会调用"operator delete"?

在阅读这个问题的答案时,我注意到答案(例如这个)意味着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++ pointers memory-management

17
推荐指数
2
解决办法
750
查看次数

C++:在删除时检查NULL

可能重复:
删除前在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)

c++

4
推荐指数
2
解决办法
604
查看次数

标签 统计

c++ ×3

memory-management ×2

pointers ×2

macros ×1