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 时通常会触发未定义行为的是当您违反容器不变量时(例如,通过修改部分索引而不使用适当的modify调用)

于 2014-06-12T13:30:26.430 回答