删除NULL指针是否安全?
这是一种好的编码风格吗?
make_shared(C ++ 11)和make_unique(C ++ 14)你的程序应该包含零的new和delete
                new或delete。专为管理资源而设计的类(其中Standard组件无法胜任)当然可以完成他们需要做的事情,但是重点是它们利用它们管理的内存而不是最终用户代码来处理丑陋的事情。因此,使您自己的库/帮助程序类执行new/ delete,然后使用该类代替它们。
                删除NULL指针是否安全?
这是一种好的编码风格吗?
make_shared(C ++ 11)和make_unique(C ++ 14)你的程序应该包含零的new和delete
                new或delete。专为管理资源而设计的类(其中Standard组件无法胜任)当然可以完成他们需要做的事情,但是重点是它们利用它们管理的内存而不是最终用户代码来处理丑陋的事情。因此,使您自己的库/帮助程序类执行new/ delete,然后使用该类代替它们。
                Answers:
delete无论如何都会执行检查,因此在您这一边进行检查会增加开销,并且看起来更难看。一个非常好的做法后,指针设置为NULL delete(有助于避免双重缺失和其它类似的内存损坏问题)。
我也很喜欢delete默认情况下是否将参数设置为NULL,例如
#define my_delete(x) {delete x; x = NULL;}(我知道R和L值,但这不是很好吗?)
来自C ++ 0x标准草案。
$ 5.3.5 / 2-“ [...]在任一替代方案中,删除操作数的值都可以为空指针值。[...'“
当然,没有人会用NULL值“删除”一个指针,但是这样做是安全的。理想情况下,不应包含删除NULL指针的代码。但是有时在循环中删除指针(例如在容器中)时有时会很有用。由于删除NULL指针值是安全的,因此可以真正编写删除逻辑,而无需显式检查要删除的NULL操作数。
顺便说一句,C Standard $ 7.20.3.2还说NULL指针上的“ free”不起作用。
free函数使ptr指向的空间被释放,即可以用于进一步分配。如果ptr是空指针,则不执行任何操作。
是的,这很安全。
删除空指针没有任何危害;如果将未分配的指针初始化为零然后简单地删除,则通常会减少函数尾部的测试次数。
由于前一句话引起了混乱,因此正在描述的示例(并非异常安全):
void somefunc(void)
{
    SomeType *pst = 0;
    AnotherType *pat = 0;
    …
    pst = new SomeType;
    …
    if (…)
    {
        pat = new AnotherType[10];
        …
    }
    if (…)
    {
        …code using pat sometimes…
    }
    delete[] pat;
    delete pst;
}
可以使用示例代码来挑选各种各样的东西,但是(我希望)这个概念很清楚。指针变量被初始化为零,因此delete函数末尾的操作不需要测试它们在源代码中是否为非空;库代码仍然执行该检查。
void func(void) { X *x1 = 0; Y *y1 = 0; … x1 = new[10] X; … y1 = new[10] Y; … delete[] y1; delete[] x1; }。我没有显示任何块结构或跳转,但是delete[]由于开始时进行了初始化,因此最后的操作很安全。如果某个东西在x1分配之后和分配之前跳到最后,并且y1没有初始化y1,则将存在未定义的行为-尽管代码可以在删除之前测试(of x1和y1)是否为空,但无需这样做所以。
                    删除空指针无效。它不一定是好的编码风格,因为它不是必需的,但也不错。
如果您正在寻找良好的编码习惯,请考虑使用智能指针,这样就根本不需要delete。
我所经历的,这是不是安全的(VS2010)删除[] NULL(即数组语法)。我不确定这是否符合C ++标准。
它是安全的删除NULL(标量语法)。
delete[] NULL。
                    
delete。请改用RAII。也就是说,使用std::vector<T> v(100);替代T* p = new T[100];,使用智能指针像unique_ptr<T>和shared_ptr<T>该照顾的缺失,而不是原始指针等