变量++操作带来的core错误

yudang 2003-04-01 03:15:35
该程序开发环境是linux下,使用gcc2.9.5。
使用gdb调试程序。

运行程序的时候,在一个程序还没有进入main函数的部分,
就出现了core错误。

程序体在一个header文件中。

#typedef unsigned long ULONG;
private:
ULONG m_length;
ULONG m_refCount;
UniteChar m_data[1];
public:
inline void AddRef()
{
if ( !isConst())
m_refCount++;
}
出错部分在m_refCount++;这一句,
#0 FJXML::SBaseManager::AddRef (this=0x82b2e54) at INC/UniteStringValue.h:187
187 m_refCount++;
在这一句往下执行就会有core dumped error.
这时,m_refCount的值0x80000003。
但假如在这句执行之前,使用如下两句语句,
gdb p m_refCount++;
gdb p m_refCount--;
程序就可以正确执行。
而假如在程序中添加这两句,又会出错。

请问一般出现这样的问题,大概会因为什么情况出现这样的问题。

请高手不吝赐教!
...全文
32 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tommy 2003-04-02
  • 打赏
  • 举报
回复
呵呵,这是我临时想出来的例子,有些细节可能不一定准确。
a g_a不一定要放在class b之前的,可以在class b之前声明一下就是了(extern a g_a),在实际情况中,声明一般是放在一个头文件中的,和定义是分开的.

你的问题可能还需要看一看上下文才行,如相关对象的定义等
yudang 2003-04-02
  • 打赏
  • 举报
回复
to Tommy
谢谢你。
原来是全局变量,我以为是局部的,我理解错了。
但是假如是全局的话,也有一个问题,
就是在c++程序中,变量在使用之前,需要先定义,
这样的话,你定义的
a g_a;这一句必须放在class b的定义部分之前啊,那样的话,你说的定义顺序不对的情况就不会产生了。

你说得很有道理,struct和class 在c++里是一样的。
出现的core dumped的error的情况非常奇怪啊。
许多人都看不出是什么原因。出错的提示信息如下:
Breakpoint 1, FJXML::SBaseManager::AddRef (this=0x82b2e54) at INC/UniteStringValue.h:187
187 m_refCount++;
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
FJXML::SBaseManager::AddRef (this=0x82b2e54) at INC/UniteStringValue.h:187
187 m_refCount++;
Tommy 2003-04-02
  • 打赏
  • 举报
回复
to yudang:
class b中使用了class a的一个全局变量g_a。上面说错了一点,class a中m_a的空间是存在的,只是其值可能不正确(没有初始化),但是应该不会有core错误。

结构struct和类class是一样的,没有任何区别,只是结构中的成员缺省访问是public,类的成员缺省是private。
yudang 2003-04-02
  • 打赏
  • 举报
回复
我编写了一个测试的例子,按照楼上的意思。
好像是可以的。运行的时候没有出错啊。

class a
{
int m_a;

public:
a() : m_a(0){}
void func() {m_a++;}
};

class b
{
public:
a *g_a;
b() { g_a->func(); };
};

int main(){

b g_b;
a g_a;
return 0;
}
yudang 2003-04-02
  • 打赏
  • 举报
回复
谢谢各位的支持

还有需要说明的是,这是一个结构,不是一个类。
该类的基类也是一个结构,基类结构中只有一个空的构造函数,
这个子类本身没有构造函数。

对于楼上的说法,有个疑问。
在class b 中,没有定义a的对象,那怎么可以在class b的构造函数中使用a 的方法呢?
假如在class b中定义了a的对象,那在class b中应该已经对a的对象进行了初始化了。
Tommy 2003-04-01
  • 打赏
  • 举报
回复
m_refCount没有被初始化。

或者,全局量初始化顺序有问题。如

class a
{
int m_a;

public:
a() : m_a(0){}
void func() {m_a++;}
};

class b
{
public:
b() { g_a.func(); }
}

b g_b;
a g_a;

上面的代码看起来没有问题,a在构造函数中也进行了初始化,但是,由于g_b在g_a之前初始化(两者都在main()之前执行构造函数),在g_b构造时使用了g_a.func(),这时g_a还没有初始化,这就会出问题。
更隐蔽的情况是g_a和g_b在两个不同的cpp中定义,由于C++没有规定不同CPP文件之间的初始化顺序,所以也会出现这样的问题。
fangrk 2003-04-01
  • 打赏
  • 举报
回复
在构造函数中初始化变量
wtb2002 2003-04-01
  • 打赏
  • 举报
回复
使用变量要养成初试化的习惯!

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧