使用QString :: clear()函数丢失Qt字符串中的保留空间吗?

Ale*_*lke 1 qt memory-management

我正在进行循环,我想将一些字符从字符串复制到另一个字符串.我知道限制大约是20个字符所以我想在循环外执行此操作:

QString name;
name.reserve(25);
Run Code Online (Sandbox Code Playgroud)

这样我就可以填充一个缓冲区,Qt避免每次解析名称时重新分配它.只是,为了得到这个名字我做这样的事情:

for(int i(0); i < 20 && *s != '\0'; ++i)
{
    name += *s;
}
Run Code Online (Sandbox Code Playgroud)

这意味着我每次都必须重置名称.我怎么能这样做,并确保每次保留的空间不会丢失?

// will reserved memory be lost after this call?
name.clear();

// would that be more likely to keep the memory buffer?
name = "";
Run Code Online (Sandbox Code Playgroud)

文档似乎没有说出这种或那种方式.

完整的循环集如下:

QString name;
name.reserve(25);

for(QChar const *s(input.data()); *s != '\0'; ++s)
{
    ...snip...
    if(<some condition>)
    {
        name.clear() // losing reserved data here?
        for(int i(0); i < 20 && *s != '\0'; ++i)
        {
            name += *s;
        }
        ...snip...
    }
    ...snip...
}
Run Code Online (Sandbox Code Playgroud)

RA.*_*RA. 5

通话QString::clear()将导致您的预留空间丢失.考虑以下:

QString s;
s.reserve(25);
qDebug() << "Before Clear: " << s.capacity();
s.clear();
qDebug() << "After Clear: " << s.capacity();
Run Code Online (Sandbox Code Playgroud)

输出:

Before Clear: 25
After Clear: 0
Run Code Online (Sandbox Code Playgroud)

删除字符串内容而不丢失保留空间的最有效方法是调用QString::resize():

QString s;
s.reserve(25);
qDebug() << "Before Resize: " << s.capacity();
s.resize(0);
qDebug() << "After Resize: " << s.capacity();
Run Code Online (Sandbox Code Playgroud)

输出:

Before Resize: 25
After Resize: 25
Run Code Online (Sandbox Code Playgroud)

在实现中QString::resize(),resize(0)对具有保留容量的字符串的调用相当于将内部大小值0设置为并将内部缓冲区的第一个字符设置为'\0'.