- 论坛徽章:
- 1
|
请教大家一个关于内存地址突变的一个问题,是这样的:
我有一个类一个方法是检测条件状态的。比如这样:- void test::checkstatus()
- {
- while(true)
- {
- printf("this = %0x\n", this);
- //其他代码
- if (this->need_process())
- {
- //process
- }
- //其他代码
- }
- }
- bool test::need_process()
- {
- printf("this = %0x\n", this);
- //检测过程
- }
复制代码 这个方法运行在多线程环境中,而且这个方法也是create出来的一个线程执行的(大家请忽略语法之类的错误)- pthread_create(pid_t, NULL, test::checkstatus, NULL);
复制代码 问题是:
test这个对象是在堆上new出来的, 、在运行的过程中checkstatus,need_process 这两个函数里面打印出来的this指针地址是一致的。
但是有时候程序在一直在正常得运行(这里指两个this打印一致,比如都是0x6EA8975),但是某个时刻checkstatus打印还是正常的(0x6EA8975),但是掉用need_process的时候
里面的打印是一个非法的地址值了,比如是(0x123),以至于need_process函数里面需要对对象成员进行修改导致段错误。
这时候,test这个对象是没有析构的(因为在析构的最前面有打印)。
我gdb进去,
1 bt full,发现有一些值已经是一些随机值了(比如一个非常大的整数)。
2 直接print *this,直接提示 0x123这个地址不能访问,
3 执行up
4 print *this发现checkstatus这里面还是正常的,所有的变量什么的都是正常值。
我的疑问是,为什么在对象没有被析构的情况下,this指针发生了跳转(正常情况这两个打印this地址的值都是一样的,而且这个段错误不是必现的),
而且他的上一跳 执行情况都是正常的 。
这个大概可能是什么情况呢?gdb之类的我不是很熟,所以想请教一下大家。
非常感谢。 |
|