执行std::string::clear回收与字符串关联的内存



例如,如果将一个文本文件加载到std::字符串中,对它执行我需要做的操作,然后对它调用clear(),这会释放容纳文本的内存吗?或者,我最好只是将其声明为指针,在需要时调用new,并在完成后删除它?

调用std::string::clear()只会将大小设置为零。capacity()不会改变(比当前保留的内存少的reserve()也不会改变容量)。如果你想回收为字符串分配的内存,你需要做一些类似的事情

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

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

std::string().swap(str);
释放未使用内存的唯一有效方法是使用成员函数shrink_to_fit()。使用交换没有任何意义,因为标准没有规定使用此操作时将释放未使用的内存。

作为的一个例子

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);

最新更新