bugfix> c++ > 投稿

VS2017で次のコードを実行すると:

#include <boost/pool/pool_alloc.hpp>
#include <map>
#include <iostream>
int main()
{
    using Map = std::map<int, int, std::less<int>, boost::pool_allocator<std::pair<const int, int>>>;
    using Pool = boost::singleton_pool<boost::pool_allocator_tag, sizeof(Map)>;
    Map temp;
    for (int i = 1; i < 5; i++) temp[i] = i;
    std::cout << "First addresses:\n";
    for (auto& kv : temp) std::cout << &kv.second << "\n";
    temp.clear();
    Pool::purge_memory();
    Map temp2;
    for (int i = 1; i < 5; i++) temp2[i] = i;
    std::cout << "Second addresses:\n";
    for (auto& kv : temp2) std::cout << &kv.second << "\n";
    temp2.clear();
    Pool::purge_memory();
    return 0;
}

私は出力を取得します:

First addresses:
02A108F4
02A1090C
02A10924
02A1093C
Second addresses:
02A1090C
02A10924
02A1093C
02A10954

ライブの例

この動作は間違っているようです: 02A108F4 に対処した結果 ?パージ中にプールに戻されなかったようです。

std::vector を使用すると、これは起こりません std::map の代わりに 。 gccもメモリを正しく返すようです:ライブの例。

これはVS2017のバグですか?

回答 1 件
  • あなたはプールの実装の詳細について物事を仮定しています。損失があるかもしれませんが、表示される割り当てパターンからこれを結論付けることはできません。

    また、 sizeof(int) に関連付けられているプールアロケーターのメモリをパージしています 。ただし、value_typeはすでに std::pair<int const, int> です 、それはマップ実装が未指定のノードタイプを代わりに割り当てるという事実を残します。

    Oh, and the reason your allocator worked is precisely the same: the container implementationknowsyou cannot possibly provide the right type of allocator, since the allocated type is unspecified. Therefore it will alwaysrebindto get the required type.

    だから、少なくともそれを作る

    Live on Rextester

    #include <boost/pool/pool_alloc.hpp>
    #include <map>
    #include <iostream>
    using Map = std::map<int, int, std::less<int>, boost::pool_allocator<int>>;
    using Pool = boost::singleton_pool<boost::pool_allocator_tag, sizeof(Map::value_type)>;
    void foo() {
        Map temp;
        for (int i = 1; i < 5; i++) temp[i] = i;
        std::cout << "First addresses:\n";
        for (auto& kv : temp) std::cout << &kv.second << "\n";
    }
    int main()
    {
        foo();
        Pool::purge_memory();
        foo();
        Pool::purge_memory();
    }
    
    

    ただし、これはまだ実装の詳細を前提としています。私考える c ++ 17は、動作するための詳細情報(http://en.cppreference.com/w/cpp/container/node_handle)を提供します。さもなければ、Boost Containerに関連する詳細が表示されることがあります:https:// www。 boost.org/doc/libs/1_51_0/doc/html/boost/container/map.html#id463544-bb

あなたの答え