执行std::string::clear回收与字符串关联的内存
Does std::string::clear reclaim the memory associated with a string?
例如,如果将一个文本文件加载到std::字符串中,对它执行我需要做的操作,然后对它调用clear(),这会释放容纳文本的内存吗?或者,我最好只是将其声明为指针,在需要时调用new,并在完成后删除它?
调用std::string::clear()
只会将大小设置为零。capacity()
不会改变(比当前保留的内存少的reserve()
也不会改变容量)。如果你想回收为字符串分配的内存,你需要做一些类似的事情
std::string(str).swap(str);
复制字符串str
通常只保留合理数量的内存,并将其与str
的表示进行交换将把生成的表示安装到str
中。显然,如果你想让字符串为空,你可以使用
std::string().swap(str);
作为的一个例子
s.clear();
s.shrink_to_fit();
我意识到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的内部的一个新实例被创建,并且它将是empty()。容量将设置为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的内容,地址显然会有所不同。
问候
这会释放保存文本的内存吗?
没有。
还是我最好把它声明为一个指针。。。
不,最好在需要的范围内声明字符串,并调用其析构函数。如果必须释放字符串仍然存在的范围内的内存,则可以执行以下操作:
std::string().swap(the_string_to_clear);