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中没有数据成员.
你正在穿越溪流.你没见过捉鬼敢死队吗?不要越过溪流.
你在这里穿过溪流:
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的完成方式.