1

假设我有以下课程:

foo{
    ~foo();

    private:
        char *bar;
};

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

4

3 回答 3

7

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

bar = nullptr;
delete bar;

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

3.7.4.2/3:

提供给释放函数的第一个参数的值可能是空指针值;如果是这样,并且如果释放函数是标准库中提供的函数,则调用无效。

于 2013-06-05T08:28:47.503 回答
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,那么它们是您最好的选择。

于 2013-06-05T08:29:51.190 回答
1

初始化barnullptr/ NULL( / ),你可以在不检查析构函数的情况下删除它。

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

于 2013-06-05T08:27:59.000 回答