【问题标题】:Deleting string object in C++在 C++ 中删除字符串对象
【发布时间】:2011-03-09 00:18:27
【问题描述】:

我的 C++ 程序中有一个字符串对象,声明如下:

string str;

我已经将一些数据复制到其中并进行了一些操作。现在我想从内存中删除 str 对象。我无法使用删除运算符,因为 str 不是指针。如何从内存中删除该对象以回收分配给它的内存?

谢谢, 拉克什。

【问题讨论】:

  • 目的是什么?不想“浪费”还是什么?

标签: c++


【解决方案1】:

您不必这样做。当字符串超出范围时,会自动调用它的析构函数并释放内存。

如果您想立即清除字符串(无需等到它超出范围)只需使用str.clear()

【讨论】:

  • 如果我们不能让它超出范围怎么办?我们仍然可以通过更改其内容来控制它在内部分配的动态内存量
  • 考虑到 OPs 帖子的语气,这个答案似乎是最好的答案。我敢打赌,OP 期望 C++ 字符串能够像 Java 或类似的东西一样工作,或者听说过 C++ 中的内存/管理有多么困难,并且担心他做错了。
  • 阅读 SGI 实现,我认为clear 不会释放内存……但其他实现可能会。
  • 请看一下 sbi 的回答。它说明了这个答案的可疑之处。
  • clear 不能保证释放内存,而且通常不会 - 在许多实现中,容量保持不变。它只是清空字符串内容,但内存缓冲区保持相同大小。
【解决方案2】:
str.clear();

str = "";

但是,正如 cmets 中所述,这并不能保证(事实上,不太可能)实际返回堆内存。也不能保证工作,但实际上工作得很好是交换技巧:

std::string().swap(str);

不过,使用小字符串优化的实现将保留几个字节的堆栈空间(当然str 本身也存在于堆栈中)。

最后,我同意所有 cmets 的说法,即您想要这样做是有问题的为什么。只要str 超出范围,无论如何都会自动删除其数据:

{
  std::string str;

  // work with str

} // str and its data will be deleted automatically

【讨论】:

  • 是否真的需要 string::clear 将容量设置为 0?否则它不会对分配的内存量产生任何影响,在我看来这就是 op 想要的。
  • 我认为@pmr 是对的,clear 可以用来清除内容,但保留内存。有时有助于避免循环内的重新分配。
  • @pmr 和@Stephen:感谢您的 cmets。我试图修正我的答案。
  • 您需要反转交换技巧 -- std::string().swap(str); -- 否则您将临时绑定到非常量引用。
  • +1 指出了 clear 用于此目的的问题,并用临时(又名 clear-and-minimize)习语演示了交换。
【解决方案3】:

添加附加范围

{
  String str;
  ...
  ...
}

以确保 str 在您不再需要时超出范围。 请记住,如何定义其他变量可能会很棘手。

【讨论】:

    【解决方案4】:

    现在我想从内存中删除 str 对象。

    你不能。至少,你不能完全删除它。 str 已经分配在堆栈上(或者如果它是全局变量,则在代码段中),并且它不会完全消失,直到您从例程返回,离开它已创建的范围(或直到您退出程序 - 对于全局变量)。

    您可以调用 .clear(),或为其分配空字符串,但不能保证所有内存都会被释放。它保证字符串长度将设置为零,但某些实现可能会决定保留最初分配的缓冲区的一部分(即保留缓冲区以加快将来的操作,如 += )。

    老实说,除非您的可用内存非常少,否则我不会打扰。这是一个非常小的物体。

    【讨论】:

      猜你喜欢
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多