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
不会变慢,但使用它会更安全。例子: