ベクトルでC++ 0xイニシャライザリストを使用すると、segフォルトが発生します。私はなぜそれが起こっているのか理解できません。私のデバッガはクラッシュが標準ライブラリにこの機能で起こることを言う:私は、この関数の目的を判断しようとしましたが、私はオンライン任意の説明/ドキュメントを見つけることができませんC++ 0xイニシャライザリストを使用しているときのSegフォルト
template<typename _T1, typename _T2>
inline void
#ifdef __GXX_EXPERIMENTAL_CXX0X__
// Allow perfect forwarding
_Construct(_T1* __p, _T2&& __value)
#else
_Construct(_T1* __p, const _T2& __value)
#endif
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 402. wrong new expression in [some_]allocator::construct
::new(static_cast<void*>(__p)) _T1(_GLIBCXX_FORWARD(_T2, __value));
}
。
私のコードで初期化リストを使用するコードは次のようになります:
bool Cube::ProcessData(MeshData* data)
{
data->Clear();
data->v =
{
Vec3(.5,-.5,-.5), Vec3(.5,-.5,.5), Vec3(-.5,-.5,.5), Vec3(-.5,-.5,-.5),
Vec3(.5, .5,-.5), Vec3(.5, .5,.5), Vec3(-.5, .5,.5), Vec3(-.5, .5,-.5)
};
...
}
ここで作成されるこの関数に渡されるデータ構造は:
はtemplate <class ProcessorT, class DataT, typename... Args>
const DataT* DataManager::RequestData(Args... args)
{
MutexLock lock(*mutex);
Request req;
data_cache.PushBack();
req.data = &data_cache.GetBack();
req.processor = new ProcessorT(args...);
request_list.push_back(req);
return static_cast<DataT*>(req.data);
}
data_cache構造が私です私がコピーを避けるために使う自分のリストクラス。 ProcessData関数は、データ構造体が作成されたスレッドとは別のスレッドで呼び出されます。
そして、これは、コールスタックのためのデバッガ出力です:
#0 004FAAD6 _Construct<UtilityLib::TVec3<float>, UtilityLib::TVec3<float> const&>(this=0x104aba0, __first=0x593fb98, __last=0x593fbf8) (c:/mingw/bin/../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_construct.h:80)
#1 00000000 uninitialized_copy<UtilityLib::TVec3<float> const*, UtilityLib::TVec3<float>*>(this=0x104aba0, __first=0x593fb98, __last=0x593fbf8) (c:/mingw/bin/../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_uninitialized.h:74)
#2 00000000 uninitialized_copy<UtilityLib::TVec3<float> const*, UtilityLib::TVec3<float>*>(this=0x104aba0, __first=0x593fb98, __last=0x593fbf8) (c:/mingw/bin/../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_uninitialized.h:116)
#3 00000000 __uninitialized_copy_a<UtilityLib::TVec3<float> const*, UtilityLib::TVec3<float>*, UtilityLib::TVec3<float> >(this=0x104aba0, __first=0x593fb98, __last=0x593fbf8) (c:/mingw/bin/../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_uninitialized.h:318)
#4 00000000 std::vector<UtilityLib::TVec3<float>, std::allocator<UtilityLib::TVec3<float> > >::_M_assign_aux<UtilityLib::TVec3<float> const*>(this=0x104aba0, __first=0x593fb98, __last=0x593fbf8) (c:/mingw/bin/../lib/gcc/mingw32/4.5.2/include/c++/bits/vector.tcc:260)
#5 004127B3 _M_assign_dispatch<UtilityLib::TVec3<float> const*>(this=0x6e8af18, data=0x104ab98) (c:/mingw/bin/../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_vector.h:1065)
#6 00000000 assign<UtilityLib::TVec3<float> const*>(this=0x6e8af18, data=0x104ab98) (c:/mingw/bin/../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_vector.h:396)
#7 00000000 operator=(this=0x6e8af18, data=0x104ab98) (c:/mingw/bin/../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_vector.h:359)
#8 00000000 GameEngine::Render3D::Cube::ProcessData(this=0x6e8af18, data=0x104ab98) (C:\CodeBlocksProjects\GameEngine\src\Primitives.cpp:56)
私は私のリストクラスが犯人かもしれないが、それであっても、私はなぜ知らないだろうと思われます。うまくいけば、StackOverflowの誰かが私にこの問題を理解させる助けになると思う。私はアドバイスや提案を感謝します。
どのコンパイラ? –
Psst: 'ProcessorT' args:' RequestData(Args && ... args) 'と'新しいProcessorT(std :: forward(args)...); '、' #include 'の完璧な転送を使用してください。 –
Xeo
@Ken: "c:/ mingw/bin /../ lib/gcc"はGCCのヒントです。 – Xeo