gpt4 book ai didi

c++ - 使用列表的此 C++ 代码出现段错误的原因是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 14:38:47 24 4
gpt4 key购买 nike

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

list<cache_page> cachedPages;

void f()
{
cache_page cpage(a,b);
cachedPages.push_back(cpage);
}

我已经注释了 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);
}
};

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

最佳答案

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

你在这里过河:

class B : public A < B *>

我不明白这是什么意思。你想做什么?阴极射线管?这不是它完成的方式。

问题不在于推回,问题在于“this”无效。

当你有

  void f()
{
cache_page cpage;
}

它被编译为 NOP。这没有被接受,一切都很好。

  void f()
{
cache_page cpage;
// oops this access
this->cachedPages.push_back(cpage);
}

除非它在 ​​A 的上下文中被调用。 this 的值是什么?它没有在任何地方初始化。所以这等于内存中的任何内容,一个快乐的未初始化列表正在等待。

修复?

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);
}
};

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

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);
}

};

这就是 CRTP 的实现方式。

关于c++ - 使用列表的此 C++ 代码出现段错误的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1454268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com