C ++中的C字符串删除
什么是好的,什么是错的? 在这种情况下,我是否必须调用delete以防止内存泄漏? 此外,C和C ++中的行为是否完全相同? 有什么不同吗?
const char* a = "blahblah"; ... delete a; char b* = new char('a'); ... delete b; char c[100] = "blahblah"; ... delete c; char d* = new char[40]; ... delete d; char e* = new char[40]; ... delete[] e;
在这种情况下,我必须调用delete以防止内存泄漏
只delete
你从new
并delete []
你从new []
。 其他每次删除都是错误的。
规则很简单:
- 不要
delete
任何未调用new
指针 - 对于使用
new[]
分配的所有内容,请使用delete[]
new[]
- 对于使用
new
分配的所有内容(无括号),请使用delete
(无括号)
通过遵循这些规则,您可以看到只有b
和e
的删除有效:
-
a
和c
尚未分配new
-
d
需要delete[]
-
b
和e
是正确的。
他们都错了。 不要在C ++程序中调用delete
(除非您直接实现内存管理原语,如智能指针) – 始终使用智能指针来处理资源破坏。 对于数组,使用像std::vector
这样的容器。 对于字符串,有一个专用的std::string
类。 最后,除了new
之外没有原始情况创建适合delete
对象,无论是直接还是正确(通过智能指针),所以如果你没有使用new
或者调用一个显式返回的函数(它应该真正返回一个智能指针) …),然后你肯定做错了。
- 错了,因为没有要删除的动态内存。
- 错了,因为你应该使用智能指针(
unique_ptr
在这里看起来很好)。 - 与1相同。
- 错了,因为你需要
std::vector
来动态分配数组。 - 与4相同。
此外,C和C ++中的行为是否完全相同? 有什么不同吗?
C中没有delete
,C也没有delete
。 只有free
,与malloc
对应。
遵循三条规则:
-
new
的与delete
; -
new[]
附带delete[]
; - 如果您想在2013年及以后编写安全,健壮,惯用的代码,请使用智能指针实现 (其结果是您将在智能指针构造函数参数中使用
new
,然后不使用delete
)。
规则是,如果你new/new[]
那么你必须使用相应的delete/delete[]
。
delete b; delete[] e;
这些是唯一正确的删除。
根据经验:
- 对于每个
new
应该有一个相应的delete
- 对于每个
new … []
应该有一个相应的delete []
这些规则不考虑exception处理。 要确保代码exception安全,请使用智能指针。 当你的意思是“字符串”时使用std::string
。