- 論壇徽章:
- 1
|
請教大家一個(gè)關(guān)于內(nèi)存地址突變的一個(gè)問題,是這樣的:
我有一個(gè)類一個(gè)方法是檢測條件狀態(tài)的。比如這樣:- void test::checkstatus()
- {
- while(true)
- {
- printf("this = %0x\n", this);
- //其他代碼
- if (this->need_process())
- {
- //process
- }
- //其他代碼
- }
- }
- bool test::need_process()
- {
- printf("this = %0x\n", this);
- //檢測過程
- }
復(fù)制代碼 這個(gè)方法運(yùn)行在多線程環(huán)境中,而且這個(gè)方法也是create出來的一個(gè)線程執(zhí)行的(大家請忽略語法之類的錯(cuò)誤)- pthread_create(pid_t, NULL, test::checkstatus, NULL);
復(fù)制代碼 問題是:
test這個(gè)對象是在堆上new出來的, 、在運(yùn)行的過程中checkstatus,need_process 這兩個(gè)函數(shù)里面打印出來的this指針地址是一致的。
但是有時(shí)候程序在一直在正常得運(yùn)行(這里指兩個(gè)this打印一致,比如都是0x6EA8975),但是某個(gè)時(shí)刻checkstatus打印還是正常的(0x6EA8975),但是掉用need_process的時(shí)候
里面的打印是一個(gè)非法的地址值了,比如是(0x123),以至于need_process函數(shù)里面需要對對象成員進(jìn)行修改導(dǎo)致段錯(cuò)誤。
這時(shí)候,test這個(gè)對象是沒有析構(gòu)的(因?yàn)樵谖鰳?gòu)的最前面有打。。
我gdb進(jìn)去,
1 bt full,發(fā)現(xiàn)有一些值已經(jīng)是一些隨機(jī)值了(比如一個(gè)非常大的整數(shù))。
2 直接print *this,直接提示 0x123這個(gè)地址不能訪問,
3 執(zhí)行up
4 print *this發(fā)現(xiàn)checkstatus這里面還是正常的,所有的變量什么的都是正常值。
我的疑問是,為什么在對象沒有被析構(gòu)的情況下,this指針發(fā)生了跳轉(zhuǎn)(正常情況這兩個(gè)打印this地址的值都是一樣的,而且這個(gè)段錯(cuò)誤不是必現(xiàn)的),
而且他的上一跳 執(zhí)行情況都是正常的 。
這個(gè)大概可能是什么情況呢?gdb之類的我不是很熟,所以想請教一下大家。
非常感謝。 |
|