0

stxxl マップに要素を挿入しようとすると、この assertion failed エラーが発生します。

アサーションエラー全体は次のとおりです。

resCache: /usr/include/stxxl/bits/containers/btree/btree.h:470: std::pair >, bool> stxxl::btree::btree::insert(const value_type&) [with KeyType = e_my_key, DataType = unsigned int, CompareType = comp_type, unsigned int RawNodeSize = 16384u, unsigned int RawLeafSize = 131072u, PDAllocStrategy = stxxl::SR, stxxl::btree::btree::value_type = std::pair]: アサーション `it != root_node_ .end()' が失敗しました。中止しました

何か案が?

編集:コードフラグメントは次のとおりです

void request_handler::handle_request(my_key& query, reply& rep)
{
    c_++;

    std::cout << "Received query " << query.content << " by thread " << boost::this_thread::get_id() << ". It is number " << c_ << "\n";
    strcpy(element.first.content, query.content);
    element.second = c_;
    testcache_.insert(element);

    STXXL_MSG("Records in map: " << testcache_.size());
}

Edit2 ここに詳細があります(MAX_QUERY_LENなどの定数は省略しています)

struct comp_type : std::binary_function<my_key, my_key, bool>
{
    bool operator () (const my_key & a, const my_key & b) const
    {
            return strncmp(a.content, b.content, MAX_QUERY_LEN) < 0;
    }
    static my_key max_value()
    {
            return max_key;
    }
    static my_key min_value()
    {
            return min_key;
    }
};

typedef stxxl::map<my_key, my_data, comp_type> cacheType;


cacheType testcache_;

request_handler::request_handler()
:testcache_(NODE_CACHE_SIZE, LEAF_CACHE_SIZE)
{
    c_ = 0;
    memset(max_key.content, (std::numeric_limits<unsigned char>::max)(), MAX_QUERY_LEN);
    memset(min_key.content, (std::numeric_limits<unsigned char>::min)(), MAX_QUERY_LEN);

    testcache_.enable_prefetching();

    STXXL_MSG("Records in map: " << testcache_.size());
}
4

1 に答える 1

0

ここにアイデアがあります: valgrind を使用してください。プログラムのローカルではないバグを診断する際に非常に役立ちます。つまり、途中のどこかでコンテナーを破損している可能性があります (よくある間違いは、反復中に消去することです)。そのため、アサーションが失敗したのは、コンテナーに何か問題があったためである可能性がありますが、プログラムが終了する直前ではない可能性があります。Valgrind は、無効なメモリ アクセスなどを見つけるのに役立ちます。

于 2012-03-22T23:07:35.587 に答える