在条件调用new时调用delete

Calling delete upon a conditional call to new

本文关键字:调用 delete new 条件      更新时间:2023-10-16

假设我有以下类:

foo{
    ~foo();
    private:
        char *bar;
};

在某些条件下,bar将创建一个新的char数组,那么处理删除它的正确方法是什么?一个简单的嘘声行吗?还是会被认为是不好的做法?

如果bar是nullptr,则可以安全地对其调用delete:

bar = nullptr;
delete bar;

所以你不需要测试,只需删除即可。

3.7.4.2/3:

提供给解除分配函数的第一个参数的值可能是空指针值;如果是这样,并且deallocation函数是标准库中提供的函数,则该调用没有任何作用。

delete使用空指针是安全的。这就是为什么在不使用时应该始终将指针设置为NULLnullptr的原因:

struct foo{
    foo() : bar(NULL) {}
        //  ^ Initialize bar to NULL
    ~foo() {
       delete bar;
    }
    void some_method() {
        bar = new char;
        ...
        delete bar;
        bar = NULL;  // Immediately set bar back to NULL
    }
    private:
        char *bar;
};

请注意,当您将指针设置为new返回的指针时,必须将其与delete匹配,而如果您使用new[]返回的指针进行设置,则一定要在其上使用delete[]

无论如何,如果您可以访问C++11智能指针std::shared_ptrstd::unique_ptr,那么它们是您的最佳选择

bar初始化为nullptr/NULL(c++11/c++(,您可以删除它,而无需在析构函数中进行任何检查。

您的类定义将包含char *bar=nullptr;