MFC臨時物件的所產生的BUG

2021-04-13 00:52:58 字數 801 閱讀 4431

現象:

檢視類中響應訊息時呼叫對話方塊

cdlgconfig dlg(this);

if(dlg.domodal() == idok)

在對話方塊構造引數中呼叫:

ccaptestview * m_pparent = getparent();

m_fourmin = m_pparent->m_fourmin;

m_emin = m_pparent->m_emin;

m_distance = m_pparent->m_distance; 

資料獲取一切正常

然而在對話方塊的onok中呼叫:

ccaptestview *pview =getparent();

pview->m_fourmin= m_fourmin ;

pview->m_emin=m_emin;

pview->m_distance=m_distance;

在修改測試大半個小時後,發現給檢視post訊息就正常,在對話方塊內調查看函式就出錯,最後終於發現bug就出在ccaptestview *pview =getparent();

mfc原始碼為:

_afxwin_inline cwnd* cwnd::getparent() const

fromhandle返回乙個與視窗關聯的臨時物件指標,這個物件不見得就是原來的那個檢視.所以在建構函式時呼叫時得到的指標正好是原來的檢視物件,但是後來得到的就可能出錯了,所以訪問其成員資料就造成了記憶體的錯誤,導致程式退出時當掉.

只是不明白為何在構造引數內呼叫getparent()每次都能返回正確的檢視物件指標.....

C 產生的臨時物件引用

統自動生成的臨時物件都是const的 include using namespace std class a class b b a a class b1 public b int main 將b1 const b b 的const修飾符去掉,編譯就不能通過,報錯說沒有匹配的函式,這是為什麼?分析 ...

臨時物件的產生與運用

所謂的臨時物件,就是一種無名物件。它的出現如果不在程式設計師的預期之下 例如,任何 pass by value操作都會引發copy操作,於是就形成了乙個臨時物件 這往往會造成效率上的負擔,但是在有些情況下,我們會刻意製造一些臨時物件,卻又會使程式乾淨清爽。刻意製造臨時物件的方法是,在型別名稱之後直接...

SQLServer中IN產生的BUG

use tempdb goif object id t1 is not null drop table t1 if object id t2 is not null drop table t2 gocreate table t1 id int create table t2 id int goins...