Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在有条件调用new时调用delete_C++_Delete Operator_C++11 - Fatal编程技术网

C++ 在有条件调用new时调用delete

C++ 在有条件调用new时调用delete,c++,delete-operator,c++11,C++,Delete Operator,C++11,假设我有以下课程: foo{ ~foo(); private: char *bar; }; 在某些情况下,bar将创建一个新的字符数组,那么处理删除它的正确方法是什么呢?一个简单的bool是可行的还是被认为是不好的做法?将条初始化为nullptr/NULL(/),您可以删除它,而无需在析构函数中进行任何检查 您的类定义将包含char*bar=nullptr将条初始化为nullptr/NULL(/),无需在析构函数中进行任何检查即可将其删除 您的类定义将包含ch

假设我有以下课程:

foo{
    ~foo();

    private:
        char *bar;
};

在某些情况下,bar将创建一个新的字符数组,那么处理删除它的正确方法是什么呢?一个简单的bool是可行的还是被认为是不好的做法?

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


您的类定义将包含
char*bar=nullptr
初始化为
nullptr
/
NULL
(/),无需在析构函数中进行任何检查即可将其删除


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

如果
为空ptr,则可以安全地在其上调用delete:

bar = nullptr;
delete bar;
所以你不需要测试,只需要删除

3.7.4.2/3:

提供给解除分配函数的第一个参数的值可以是空指针值;如果是,并且如果解除分配函数是标准库中提供的函数,则调用无效


如果
bar
为空ptr,则可以安全地在其上调用delete:

bar = nullptr;
delete bar;
所以你不需要测试,只需要删除

3.7.4.2/3:

提供给解除分配函数的第一个参数的值可以是空指针值;如果是,并且如果解除分配函数是标准库中提供的函数,则调用无效


delete
ing空指针是安全的。这就是为什么不使用时,应始终将指针设置为
NULL
nullptr

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_ptr
std::unique_ptr
,那么它们是您的最佳选择。

删除
空指针是安全的。这就是为什么不使用时,应始终将指针设置为
NULL
nullptr

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_ptr
std::unique_ptr
,那么它们是您的最佳选择。

假设我要对二维数组执行此操作,您如何将第二个元素设置为NULL?@DavidS,如果您需要数组,为什么不使用
std::vector
?@DavidS@DenisNovikov在程序启动时使用2d数组将值映射到屏幕上的每个像素,也从我的理解来看,向量稍微慢一些,所以这就是我选择数组的原因。@DavidS,正如我从下面的示例中看到的,
std::vector
的构造/销毁速度较慢,但不是数据访问。如果您不需要经常创建/销毁数组,
std::vector
不会变慢,但使用它会更安全。示例:假设我要对2D数组执行此操作,如何将第二个元素设置为NULL?@DavidS,如果需要数组,为什么不使用
std::vector
?@DavidS@DenisNovikov使用2D数组在程序启动时将值映射到屏幕上的每个像素,另外,据我所知,向量的构造/销毁速度稍慢,所以我选择了数组。@DavidS,正如我从下面的示例中看到的,
std::vector
的构造/销毁速度较慢,但数据访问速度较慢。如果您不需要经常创建/销毁数组,
std::vector
不会变慢,但使用它会更安全。例子: