странное поведение с CString MFC

#c #visual-studio #mfc #stack #cstring

#c #visual-studio #mfc #стек #cstring

Вопрос:

Я получаю самое странное поведение памяти, используя CString MFC:

строка 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**)amp;(m_pRunPCD->m_PCD_Dir): 
0x007ec270  wchar_t * *

m_pRunPCD->m_PCD_Dir.m_pszData:
0x007ee8a0 "C:ProgramDataWAIPC-DMIS"    wchar_t *

(wchar_t**)amp;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
CStringTamp; operator=(_In_ const CStringTamp; 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> > > amp; 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  
  

память:

 amp;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  
  

тогда значение правильное.
есть идеи, в чем проблема ?! я совершенно в тупике. любая помощь будет с благодарностью! Спасибо.

Ответ №1:

Вместо:

 PCD_Dir = m_pRunPCD->m_PCD_Dir;
  

попробуйте:

 PCD_Dir = (LPCTSTR) m_pRunPCD->m_PCD_Dir;
  

Комментарии:

1. это приводит к тому же результату, что и выше

Ответ №2:

Оказывается, адреса strSrc и m_pRunPCD->m_PCD_Dir были смещены на 1, что стало причиной того, что указатель буфера был недействительным. оказывается, я неправильно включил упаковку в заголовочный файл, чтобы решить другую проблему, которая привела к этой проблеме.

Комментарии:

1. Вы всегда должны включать системные заголовки в качестве первого элемента в свои исходные файлы, прежде чем ваши локальные includes или любые другие директивы. Это сохранит согласованность.