在C++中删除字符串对象

9

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

string str;

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

3
意图是什么?不想“浪费”还是其他原因? - sharptooth
4个回答

16

不需要。当字符串超出作用域时,它的析构函数将自动调用,并释放内存。

如果你想立即清除字符串(而不必等到它超出作用域),只需使用 str.clear()


如果我们无法使其超出范围怎么办?我们仍然可以通过更改其内容来控制它内部分配的动态内存量。 - newacct
1
这个答案似乎是根据OP的帖子语气给出的最佳答案。我打赌OP期望C++字符串的工作方式像Java一样,或者听说过C++中内存管理的困难,并担心自己做错了什么。 - Omnifarious
阅读SGI的实现,我认为clear不会释放内存...但其他实现可能会。 - Stephen
1
请查看sbi的回答。它说明了这个答案有什么可疑之处。 - pmr
1
clear不能保证释放内存,而且通常不会释放。在许多实现中,容量仍然保持不变。它只是清空字符串内容,但内存缓冲区的大小保持不变。 - stinky472

9
str.clear();

或者
str = "";

然而,正如评论中所述,这并不保证(实际上相当不可能)确实返回堆内存。另外也无法保证其可行性,但在实践中运作良好的是交换技巧:

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

然而,实现采用小字符串优化的话将保留一些字节的堆栈空间(当然,str本身也存在于堆栈上)。

最终,我同意所有评论中提到的疑问,即为什么要这样做。只要str超出其作用域,其数据就会自动删除:

{
  std::string str;

  // work with str

} // str and its data will be deleted automatically

string::clear是否真的需要将容量设置为0吗?否则它对分配的内存量没有任何影响,而我认为这正是运算符所需的。 - pmr
我认为@pmr是正确的,“clear”可以用来清除内容,但保留内存。有时在循环内避免重新分配内存会很有帮助。 - Stephen
@pmr和@Stephen:感谢您们的评论。我尝试修正了我的答案。 - sbi
1
你需要反转交换技巧 -- std::string().swap(str); -- 否则你会将一个临时对象绑定到非 const 引用上。 - avakar
1
+1 指出了使用 clear() 方法存在问题,并展示了利用临时变量进行交换的“清除和最小化”习惯用法。 - stinky472
显示剩余2条评论

2

添加额外的范围

{
  String str;
  ...
  ...
}

为了确保当你不再需要str时它会超出范围。请记住,这可能会在其他变量的定义方面变得棘手。

1
现在我想从内存中删除这个str对象。
你不能。至少,你无法完全删除它。str已经在栈上分配了空间(或者如果它是全局变量,则在代码段中),并且它不会完全消失,直到你从程序中返回,从创建它的作用域中退出(或者直到你退出整个程序 - 对于全局变量)。
你可以调用.clear()方法,或者将其赋值为空字符串,但这并不能保证所有的内存都会被释放。它只保证字符串的长度将被设置为零,但某些实现可能决定保留部分最初分配的缓冲区(例如,保留缓冲区以加快未来的操作,如+=)。
老实说,除非你有非常少量的可用内存,否则我不会费心去做这个。这是一个非常小的对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接