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