使用列表使用此C++代码进行分段错误的原因是什么?

Roh*_*nga 0 c++ stl list segmentation-fault

我有一些复杂的C++代码,但问题缩小到在push_back结构列表上执行:

list<cache_page> cachedPages;

void f()
{
    cache_page cpage(a,b);
    cachedPages.push_back(cpage);
}
Run Code Online (Sandbox Code Playgroud)

我已经评论了所有数据成员,但struct cache_page仍然存在错误.如果我评论该push_back行,则没有错误.

可能是什么原因?

我尝试过使用GDB,错误发生在_List_Node_base::hook()函数中.

template < class T >
class A
{
    T x;
    public:
        void func()
        {
          x->f();
        }

};

class B : public A < B* >
{
    list<cache_page> cachedPages;
    public:
        void f()
        {
            cache_page cpage;
            cachedPages.push_back(cpage);
        }
};
Run Code Online (Sandbox Code Playgroud)

我有一个什么都不做的复制构造函数.我在cache_page中没有数据成员.

Edo*_* A. 6

你正在穿越溪流.你没见过捉鬼敢死队吗?不要越过溪流.

你在这里穿过溪流:

class B : public A < B *>
Run Code Online (Sandbox Code Playgroud)

我不明白这一点.你想做什么?CRTP?这不是它的方式.

问题不在于推迟,问题是"这个"无效.

当你有

  void f()
  {
    cache_page cpage;
  }
Run Code Online (Sandbox Code Playgroud)

它被编译为NOP.这是没有加入一切都很好.

  void f()
  {
    cache_page cpage;
    // oops this access
    this->cachedPages.push_back(cpage);
  }
Run Code Online (Sandbox Code Playgroud)

除了在A.的背景下调用它有什么价值?它没有在任何地方初始化.所以这等于内存中的任何内容,其中一个快乐的未初始化列表正在等待.

修复?

template < class T >
class A
{
  T * _x;
public:
 explicit A(T * x) : _x(x) {}

 void func()
 {
   _x->f();
 }

};


class B : public A < B >
{
  list<cache_page> cachedPages;
public:
  B(void) : A<B>(this) {}

  void f()
  {
    cache_page cpage;
    cachedPages.push_back(cpage);
  }
};
Run Code Online (Sandbox Code Playgroud)

这应该更好.但是关于...

template < class T >
class A
{
public:
 void func()
 {
   static_cast<T>(this)->f();
 }

};


class B : public A<B>
{
  list<cache_page> cachedPages;
public:
  void f()
  {
    cache_page cpage;
    cachedPages.push_back(cpage);
  }

};
Run Code Online (Sandbox Code Playgroud)

这就是CRTP的完成方式.