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你从newdelete []你从new [] 。 其他每次删除都是错误的。

规则很简单:

  • 不要delete任何未调用new指针
  • 对于使用new[]分配的所有内容,请使用delete[] new[]
  • 对于使用new分配的所有内容(无括号),请使用delete (无括号)

通过遵循这些规则,您可以看到只有be的删除有效:

  • ac尚未分配new
  • d需要delete[]
  • be是正确的。

他们都错了。 不要在C ++程序中调用delete (除非您直接实现内存管理原语,如智能指针) – 始终使用智能指针来处理资源破坏。 对于数组,使用像std::vector这样的容器。 对于字符串,有一个专用的std::string类。 最后,除了new之外没有原始情况创建适合delete对象,无论是直接还是正确(通过智能指针),所以如果你没有使用new或者调用一个显式返回的函数(它应该真正返回一个智能指针) …),然后你肯定做错了。

  1. 错了,因为没有要删除的动态内存。
  2. 错了,因为你应该使用智能指针( unique_ptr在这里看起来很好)。
  3. 与1相同。
  4. 错了,因为你需要std::vector来动态分配数组。
  5. 与4相同。

此外,C和C ++中的行为是否完全相同? 有什么不同吗?

C中没有delete ,C也没有delete 。 只有free ,与malloc对应。

遵循三条规则:

  1. new的与delete ;
  2. new[]附带delete[] ;
  3. 如果您想在2013年及以后编写安全,健壮,惯用的代码,请使用智能指针实现 (其结果是您将在智能指针构造函数参数中使用new ,然后使用delete )。

规则是,如果你new/new[]那么你必须使用相应的delete/delete[]

 delete b; delete[] e; 

这些是唯一正确的删除。

根据经验:

  • 对于每个new应该有一个相应的delete
  • 对于每个new … []应该有一个相应的delete []

这些规则不考虑exception处理。 要确保代码exception安全,请使用智能指针。 当你的意思是“字符串”时使用std::string