0

アプリケーションでキャッシュをサポートするために、Boost マルチ インデックス マップ コンテナーを使用しています。しかし、挿入中にアプリケーションがクラッシュしました。私のコードはこのように見えます

class MultiIndexMap
{
public:
    MultiIndexMap();
    ~MultiIndexMap();

    string  _uid;
    string  _name1;
    string  _name2;
};

/**
 * Tags for accessing corresponding indices
 */
class uid{};
class name1{};
class name2{};

/** 
 *   - a unique index sorted by MultiIndexMap::_uid,
 *   - a non-unique index sorted by MultiIndexMap::name1,
 *   - a non-unique index sorted by MultiIndexMap::name2.
 */

typedef multi_index_container<
    MultiIndexMap, 
    indexed_by< 
    ordered_unique< tag<uid>,  BOOST_MULTI_INDEX_MEMBER(MultiIndexMap,string,_uid)>,
    ordered_non_unique< tag<name1>,BOOST_MULTI_INDEX_MEMBER(MultiIndexMap,string,_name2)>,
    ordered_non_unique< tag<name2>, BOOST_MULTI_INDEX_MEMBER(MultiIndexMap,string,_name2)> > > MultiIndexMap_set;

void Insert(MultiIndexMap_set& s, MultiIndexMap& entry)
{
    MultiIndexMap_set::nth_index<0>::type& uid_index= s.get<0>();
    
    uid_index.insert(entry); <<-- crashing at this line
}

このクラッシュの原因は何でしょうか。

ここに画像の説明を入力

これは、アプリケーションで発生している場所とクラッシュです。

4

1 に答える 1

1

未定義の動作があると想定する必要があります。

次のテストは、MSVC (VS2013)、GCC、および Clang で動作します: Live On Coliru

#if !defined(NDEBUG)
#define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING
#define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE
#endif

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>

using boost::multi_index_container;
namespace bmi = boost::multi_index;

class MultiIndexMap
{
public:
    MultiIndexMap() {}
    ~MultiIndexMap() {}

    std::string  _uid;
    std::string  _name1;
    std::string  _name2;
};

/**
 * Tags for accessing corresponding indices
 */
class uid{};
class name1{};
class name2{};

/**
 *   - a unique index sorted by MultiIndexMap::_uid,
 *   - a non-unique index sorted by MultiIndexMap::name1,
 *   - a non-unique index sorted by MultiIndexMap::name2.
 */

typedef multi_index_container<
    MultiIndexMap,
    bmi::indexed_by<
        bmi::ordered_unique<bmi::tag<uid>, BOOST_MULTI_INDEX_MEMBER(MultiIndexMap, std::string, _uid)>,
        bmi::ordered_non_unique<bmi::tag<name1>, BOOST_MULTI_INDEX_MEMBER(MultiIndexMap, std::string, _name2)>,
        bmi::ordered_non_unique<bmi::tag<name2>, BOOST_MULTI_INDEX_MEMBER(MultiIndexMap, std::string, _name2)>
    > > MultiIndexMap_set;

void Insert(MultiIndexMap_set& s, MultiIndexMap& entry)
{
    MultiIndexMap_set::nth_index<0>::type& uid_index = s.get<0>();
    uid_index.insert(entry); //<< --crashing at this line
}

int main()
{
    MultiIndexMap_set x;

    MultiIndexMap m;
    m._uid = "uid_1";
    m._name1 = "name1_1";
    m._name2 = "name2_1";
    Insert(x, m);

    m._uid = "uid_2";
    m._name1 = "name1_2";
    m._name2 = "name2_2";
    Insert(x, m);

    m._uid = "uid_3";
    m._name1 = "name1_3";
    m._name2 = "name2_3";
    Insert(x, m);

    for (auto& i : x)
        std::cout << i._uid << "\n";
}

現在、MultiIndex を使用しているときに Undefined Behavior をトリガーするのは通常、コンテナーの不変条件に違反したmodify場合です (たとえば、適切な呼び出しを使用せずにインデックスの一部を変更した場合)。

于 2014-06-12T13:30:26.430 に答える