【发布时间】:2011-03-09 00:18:27
【问题描述】:
我的 C++ 程序中有一个字符串对象,声明如下:
string str;
我已经将一些数据复制到其中并进行了一些操作。现在我想从内存中删除 str 对象。我无法使用删除运算符,因为 str 不是指针。如何从内存中删除该对象以回收分配给它的内存?
谢谢, 拉克什。
【问题讨论】:
-
目的是什么?不想“浪费”还是什么?
标签: c++
我的 C++ 程序中有一个字符串对象,声明如下:
string str;
我已经将一些数据复制到其中并进行了一些操作。现在我想从内存中删除 str 对象。我无法使用删除运算符,因为 str 不是指针。如何从内存中删除该对象以回收分配给它的内存?
谢谢, 拉克什。
【问题讨论】:
标签: c++
您不必这样做。当字符串超出范围时,会自动调用它的析构函数并释放内存。
如果您想立即清除字符串(无需等到它超出范围)只需使用str.clear()。
【讨论】:
clear 不会释放内存……但其他实现可能会。
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
【讨论】:
clear 可以用来清除内容,但保留内存。有时有助于避免循环内的重新分配。
std::string().swap(str); -- 否则您将临时绑定到非常量引用。
添加附加范围
{
String str;
...
...
}
以确保 str 在您不再需要时超出范围。 请记住,如何定义其他变量可能会很棘手。
【讨论】:
现在我想从内存中删除 str 对象。
你不能。至少,你不能完全删除它。 str 已经分配在堆栈上(或者如果它是全局变量,则在代码段中),并且它不会完全消失,直到您从例程返回,离开它已创建的范围(或直到您退出程序 - 对于全局变量)。
您可以调用 .clear(),或为其分配空字符串,但不能保证所有内存都会被释放。它保证字符串长度将设置为零,但某些实现可能会决定保留最初分配的缓冲区的一部分(即保留缓冲区以加快将来的操作,如 += )。
老实说,除非您的可用内存非常少,否则我不会打扰。这是一个非常小的物体。
【讨论】: