アプリケーションのキャッシュをサポートするために、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
}
このクラッシュの理由は何でしょうか。
これは、アプリケーションで取得している場所とクラッシュです。
私たちはあなたが未定義の振る舞いをしていると仮定しなければなりません。
次のテストは、MSVC(VS2013)、GCC、およびClangで機能します。LiveOnColiru
#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
呼び出しを使用せずにインデックスの一部を変更することによって)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加