std :: string :: clear是否会回收与字符串关联的内存?

时间:2013-12-08 18:48:09

标签: c++ stl

例如,如果将文本文件加载到std :: string中,做了我需要做的事情,然后在其上调用clear(),这会释放保存文本的内存吗?或者我最好只是将它声明为指针,在需要时调用new,并在我完成时删除它?

4 个答案:

答案 0 :(得分:14)

调用std::string::clear()仅将大小设置为零。 capacity()不会改变(也不会reserve()比当前保留的内存更少更改容量。如果要回收为字符串分配的内存,则需要按照

的顺序执行操作
std::string(str).swap(str);

复制字符串str通常只会保留合理数量的内存,并将其与str的表示形式交换,将生成的表示形式安装到str中。显然,如果你想让字符串为空,你可以使用

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

答案 1 :(得分:5)

释放未使用内存的唯一有效方法是使用成员函数shrink_to_fit()。使用swap没有任何意义,因为标准没有说使用此操作时将释放未使用的内存。

作为一个例子

s.clear();
s.shrink_to_fit();

答案 2 :(得分:1)

  

...这会释放持有文本的内存吗?

没有

  

或者我只是将其声明为指针,我会更好......

不,你最好在需要它的范围内声明字符串,并让它的析构函数被调用。如果必须释放字符串仍然存在的范围内的内存,则可以执行以下操作:

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

答案 3 :(得分:1)

我意识到OP已经过时但想要增加一些精度。当我试图理解一个似乎在这里提供答案的行为时,我发现了这篇文章。

使用gcc4.8.3,clear()可能看起来像在某些情况下释放内存。

std::string local("this is a test");
std::cout << "Before clear: " << local.capacity() << '\n';
local.clear();
std::cout << "After clear:  " << local.capacity() << '\n';

正如所料,我得到了

    Before clear: 14
    After clear: 14

现在让我们在混音中添加另一个字符串:

std::string local("this is a test");
std::string ref(local);  // created from a ref to local
std::cout << "Before clear: " << local.capacity() << '\n';
local.clear();
std::cout << "After clear:  " << local.capacity() << '\n';

这次我得到了:

    Before clear: 14
    After clear: 0

看起来stdc ++有一些优化,只要有可能,就会共享包含字符串内容的内存。根据是否共享字符串,行为会有所不同。在最后一个示例中,当调用clear()时,将创建std :: string local内部的新实例,它将为空()。容量将设置为0.可以从容量()的输出得出结论,某些内存被释放,但事实并非如此。

这可以通过以下代码证明:

std::string local("this is a test");
std::string ref(local);  // created from a ref to local
std::cout << (int*)local.data() << ' ' << (int*)ref.data() << '\n';

会给:

    0x84668cc 0x84668cc

这两个字符串指向相同的数据,我没有反映出来。添加local.clear()或修改local或ref的任何内容,显然地址会有所不同。

此致