例如,如果将文本文件加载到std :: string中,做了我需要做的事情,然后在其上调用clear(),这会释放保存文本的内存吗?或者我最好只是将它声明为指针,在需要时调用new,并在我完成时删除它?
答案 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的任何内容,显然地址会有所不同。
此致