C ++继承问题导致分段错误

时间:2010-12-10 03:53:41

标签: c++

以下是一些示例代码,用于说明我遇到的问题。

#include <iostream>

using namespace std;

class Foo
{
    public:
        Foo(int x)
        { m_x = x; }
        int getX()
        { return m_x; }
    private:
        int m_x;
};

class Bar : public Foo
{
    public:
        Bar(int x) : Foo(x)
        {}
        //some other stuff
};

int main()
{
    Bar* bar = new Bar(5);
    cout<<bar->getX()<<endl;
    return 0;
}

我正在开展一个大型项目,我的情况类似于上面。当调用bar-&gt; getX()时,this指针为0x0,导致分段错误。我已经尝试将getX函数压缩到Bar类,但是这不能解决问题,这个指针仍然是0x0。有任何想法吗?我不知道如何谷歌这个,只发现人们有虚拟功能的问题。

PS。这个样本有效。

编辑:

std::cout<<m_engine<<std::endl;
focus_x = m_engine->getX(); 

输出为:0x2e6d763638667858(非空),所以这不是问题......

2 个答案:

答案 0 :(得分:1)

我的猜测,从你的编辑来看,m_engine是一个悬空指针。

也就是说,m_engine指向的内存为delete d。您仍然拥有存储在m_engine中的 分配内存的地址,但是当您尝试在内存中访问该地址时,期望有效的FooBar,等对象,操作系统回收了那部分内存,另一个对象可能正在使用该内存。

访问已解除分配的内存是C ++中未定义的行为。

我建议你在m_engine析构函数中添加一个断点(无论类是什么),看看谁正在删除m_engine

另一种可能性是内存损坏,但诊断起来要困难得多。

答案 1 :(得分:0)

this指针为0x0时,表示您在NULL指针上调用了成员函数。您将需要追溯代码并找出对象指针如何变为NULL。您的示例代码中没有足够的内容来诊断问题。