以下是一些示例代码,用于说明我遇到的问题。
#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(非空),所以这不是问题......
答案 0 :(得分:1)
我的猜测,从你的编辑来看,m_engine
是一个悬空指针。
也就是说,m_engine
指向的内存为delete
d。您仍然拥有存储在m_engine
中的 分配内存的地址,但是当您尝试在内存中访问该地址时,期望有效的Foo
,Bar
,等对象,操作系统回收了那部分内存,另一个对象可能正在使用该内存。
访问已解除分配的内存是C ++中未定义的行为。
我建议你在m_engine
析构函数中添加一个断点(无论类是什么),看看谁正在删除m_engine
。
另一种可能性是内存损坏,但诊断起来要困难得多。
答案 1 :(得分:0)
当this
指针为0x0时,表示您在NULL指针上调用了成员函数。您将需要追溯代码并找出对象指针如何变为NULL。您的示例代码中没有足够的内容来诊断问题。