-3

什么是好的,什么是错的?在这种情况下,我必须调用 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;
4

7 回答 7

11

在这种情况下,我必须调用 delete 以防止内存泄漏

只有delete你得到了什么newdelete []你得到了什么new []。其他所有删除都是错误的。

于 2013-02-21T19:54:10.163 回答
3

规则很简单:

  • 不要delete任何你没有调用的指针new
  • 用于delete[]您分配的所有内容new[]
  • 使用delete(无括号)分配的所有内容new(无括号)

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

  • a并且c没有被分配一个new
  • d需要一个delete[]
  • b并且e是正确的。
于 2013-02-21T19:55:48.710 回答
3

他们都错了。永远不要调用deleteC++ 程序(除非您直接实现内存管理原语,如智能指针) - 始终使用智能指针来处理资源破坏。对于数组,使用像std::vector<T>. 对于字符串,有一个专门的std::string类。最后,除了直接或正确地(通过智能指针)创建new适用于),那么你肯定做错了。deletenew

  1. 错误,因为没有要删除的动态内存。
  2. 错了,因为你应该使用智能指针(unique_ptr在这里看起来不错)。
  3. 同 1。
  4. 错误,因为您需要std::vector动态分配的数组。
  5. 同4。
于 2013-02-21T19:58:51.943 回答
2

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

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

于 2013-02-21T20:07:55.537 回答
2

遵守三个规则:

  1. new搭配delete;
  2. new[]搭配delete[];
  3. 如果您想在 2013 年及以后编写安全、健壮、惯用的代码,请使用智能指针实现(其结果是您将new在智能指针构造函数参数中使用,然后使用delete)。
于 2013-02-21T20:18:52.700 回答
1

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

于 2013-02-21T19:55:24.923 回答
1
delete b;
delete[] e;

这些是唯一正确的删除。

根据经验:

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

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

于 2013-02-21T19:55:48.940 回答