1

如前所述, 强制任何标准容器释放其堆内存,您只需交换(或分配给)一个空容器即可

但这似乎不适用于boost::small_vector.

#include <boost/container/small_vector.hpp>
#include <iostream>

typedef boost::container::small_vector<int,4> Vec;

int main()
{
    Vec v;
    std::cout << v.capacity() << "\n";
    for (int i = 0 ; i < 100 ; ++i)
        v.push_back(i);
    std::cout << v.capacity() << "\n";
    Vec().swap(v);
    // v = Vec(); // doesn't work either
    std::cout << v.capacity() << "\n";
}

输出(Linux x86_64 上的 Boost 1.76):

4
142
142

我知道我可以打电话shrink_to_fit。但在我看来,这使得我的一些通用代码比它应该的更混乱。

这种行为是故意的吗?如果是这样,为什么?如果不是,它是否有资格作为一个错误?

4

1 回答 1

2

众所周知,要强制任何标准容器释放其堆内存,您只需交换(或分配给)一个空容器即可。

为了超级技术,标准中没有保证空容器最初不会像旧容器那样具有同样大的容量。因此,从技术上讲,您无法从容量中推断出分配尚未释放。

我知道我可以打电话给shrink_to_fit。但在我看来,这使得我的一些通用代码比它应该的更混乱。

编辑:正如 sehe 的演示std::swap所示,使用(或boost::swap) 代替成员交换时似乎没有问题。

然而,写一个泛型应该不会太糟糕shrink_if_has_capacity。我的意思是,该模板的实现可能是一些潜在的混乱行,但它的用法会一样干净,而且意图甚至比交换更清晰。

这种行为是故意的吗?

文档非常简洁。没有关于行为的规范,也没有理由。因此,除了作者之外,答案可能是未知的。

于 2021-10-06T01:31:24.013 回答