在对新的条件调用时调用delete

时间:2013-06-05 08:26:32

标签: c++ delete-operator

假设我有以下课程:

foo{
    ~foo();

    private:
        char *bar;
};

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

3 个答案:

答案 0 :(得分:7)

如果bar为nullptr,那么您可以安全地在其上调用delete:

bar = nullptr;
delete bar;

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

  

3.7.4.2/3:

     

提供给释放函数的第一个参数的值可以是空指针值;如果是这样,并且如果解除分配功能是标准库中提供的功能,则该呼叫无效。

答案 1 :(得分:4)

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,那么它们是您最好的选择。

答案 2 :(得分:1)

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

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