[英]strange behavior with MFC's CString
我使用MFC CString獲得最奇怪的內存行為:
第138行:PCD_Dir = m_pRunPCD-> m_PCD_Dir;
聲明:
CString PCD_Dir; (file scope, defined as a global outside of CServer )
class CRunPCD {
public:
CString m_PCD_Dir;
}
調用堆棧:
Support.dll!CServer::Init(CCfcController * pv=0x007ebe78) Line 138 C++
Support.dll!CCfcController::OnInitialUpdate() Line 156 + 0xf bytes C++
Support.dll!CCfcApp::CCncApp() Line 140 C++
Support.dll!newInstance() Line 162 + 0x2c bytes C++
記憶(來自觀察窗口):
(wchar_t**)&(m_pRunPCD->m_PCD_Dir):
0x007ec270 wchar_t * *
m_pRunPCD->m_PCD_Dir.m_pszData:
0x007ee8a0 "C:\ProgramData\WAI\PC-DMIS\" wchar_t *
(wchar_t**)&PCD_Dir:
0x068f4698 class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > PCD_Dir wchar_t * *
PCD_Dir.m_pszData:
0x789cb8f8 "" wchar_t *
然后我進入作業,我的環境看起來像這樣:
碼:
// Assignment operators
CStringT& operator=(_In_ const CStringT& strSrc)
{
CThisSimpleString::operator=( strSrc );
return( *this );
}
調用堆棧:
mfc100ud.dll!ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >::operator=(const ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > & strSrc=<Bad Ptr>) Line 1218 C++
Support.dll!CServer::Init(CCfcController * pv=0x007ebe78) Line 141 C++
Support.dll!CCfcController::OnInitialUpdate() Line 156 + 0xf bytes C++
Support.dll!CCfcApp::CCncApp() Line 140 C++
Support.dll!newInstance() Line 162 + 0x2c bytes C++
記憶:
&strSrc
0x007ec269 const ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > *
strSrc.m_pszData:
0xff000000 <Bad Ptr> wchar_t *
所以由於某種原因,價值沒有正確通過......? 有趣的是,如果看這個框架:
CNCSupport.dll!CServer::Init(CCncController * pv=0x007ebe78) Line 141 C++
那么價值是正確的。 任何想法是什么問題?! 我完全難過了。 任何幫助將不勝感激! 謝謝。
代替:
PCD_Dir = m_pRunPCD->m_PCD_Dir;
嘗試:
PCD_Dir = (LPCTSTR) m_pRunPCD->m_PCD_Dir;
結果是strSrc和m_pRunPCD-> m_PCD_Dir的地址偏移了1,這就是緩沖區指針無效的原因。 事實證明我錯誤地啟用了在頭文件中打包以解決導致此問題的另一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.