2

これが私の設定です(煮詰めて)。私は「レイアウト機能」を持っています:

  struct LayoutFunc {
    LayoutFunc( int limit , int value ) { lim.push_back(limit); val.push_back(value); }
    //LayoutFunc(LayoutFunc&& func) : lim(func.lim),val(func.val) {}
    LayoutFunc(const LayoutFunc& func) : lim(func.lim),val(func.val) {} // error: std::bad_alloc
    LayoutFunc(const std::vector<int>& lim_, 
               const std::vector<int>& val_ ) : lim(lim_),val(val_) {}
    LayoutFunc curry( int limit , int value ) const {
      std::vector<int> rlim(lim);
      std::vector<int> rval(val);
      rlim.push_back(limit);
      rval.push_back(value);
      LayoutFunc ret(rlim,rval);
      return ret;
    };
    std::vector<int> lim;
    std::vector<int> val;
  };

次に、以下を使用するクラスがありますLayoutFunc

template<class T> class A
{
public:
  A( const LayoutFunc& lf_ ) : lf(lf_), member( lf.curry(1,0) ) {}
  A(const A& a): lf(lf), member(a.function) {}  // corresponds to line 183 in real code
private:
  LayoutFunc lf;
  T member;
};

データメンバーの順序は正しいです。class Aレイアウト機能を「カレー」するためにわずかに異なる数字を使用するようなタイプは他にもあります。スペースを節約するために、ここでは印刷しません(構造は同じで、番号が異なるだけです)。最後に私は次のようなものを使用します:

A< B< C<int> > > a( LayoutFunc(1,0) );

これは、テンプレートタイプの順序に従って「カレー」レイアウト関数を構築します。

さて、おそらくこの単純な(煮詰めた)例が機能します。ただし、実行時の実際のアプリケーションではterminate called after throwing an instance of 'std::bad_alloc'、のコピーコンストラクターでを取得しますLayoutFunc

一時的なものへの参照を取得することに関係するセットアップに欠陥があると思います。この一時的なものは、コンシューマー(この場合はのコピーコンストラクターLayoutFunc)が使用する前に破棄されます。これはlim(func.lim),val(func.val)失敗することを説明します。curryしかし、特にtrueを返すため、欠陥がどこにあるのかわかりませんlvalue。また、moveコンストラクターで試して、c++11モードでコンパイルしました。同じ振る舞い。

ここにバックトレースがあります:

#0  0x00007ffff6437445 in __GI_raise (sig=<optimised out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#1  0x00007ffff643abab in __GI_abort () at abort.c:91
#2  0x00007ffff6caa69d in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff6ca8846 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff6ca8873 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007ffff6ca896e in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007ffff6c556a2 in std::__throw_bad_alloc() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00000000004089f6 in allocate (__n=18446744073709551592, this=0x7fffffffdaf8) at /usr/include/c++/4.6/ext/new_allocator.h:90
#8  _M_allocate (__n=18446744073709551592, this=0x7fffffffdaf8) at /usr/include/c++/4.6/bits/stl_vector.h:150
#9  _Vector_base (__a=..., __n=18446744073709551592, this=0x7fffffffdaf8) at /usr/include/c++/4.6/bits/stl_vector.h:123
#10 vector (__x=..., this=0x7fffffffdaf8) at /usr/include/c++/4.6/bits/stl_vector.h:279
#11 LayoutFunc (func=..., this=0x7fffffffdae0) at layoutfunc.h:17
#12 A (a=..., this=0x7fffffffdad0) at A.h:183

Ah:183は:のコピーコンストラクタですA

  A(const A& a): lf(lf), member(a.function) {}
4

1 に答える 1

3
A(const A& a): lf(lf), member(a.function) {}

する必要があります

A(const A& a): lf(a.lf), member(a.function) {}

BЈовић のコメントは、このバグを見つける方向を示してくれました。回答を投稿すると、+1 BЈовић. seheがBTを理解できるようにするためにも+1

于 2012-10-10T11:15:50.610 に答える