[英]Visual C++ 2010 refuses to show std::string value when debugging. Shows <Bad Ptr>
[英]C++ std::string Parameter is <Bad Ptr>
我正在使用Visual Studio 2010。
我有一個具有以下構造函數的類:
CVideoAnnotation::CVideoAnnotation(std::string aPort, DWORD aBaudRate)
我創建了一個CVideoAnnotation實例,如下所示:
CVideoAnnotation cVideoAnnotation("COM3", CBR_9600);
'CBR_9600'是一個解析為9600的宏。
在構造函數中,aBaudRate是預期的9600。 但是,aPort無法正常通過。 當我將光標懸停在它上面時,IntelliSense給出的值為<Bad Ptr>
。
有沒有人想過為什么字符串沒有正確通過?
謝謝,戴夫
作為我原始問題的更新,我在構造函數中添加了構造函數調用的匯編代碼和locals的集合。
CVideoAnnotation cVideoAnnotation("COM3", CBR_9600);
0041177D push 2580h
00411782 sub esp,20h
00411785 mov ecx,esp
00411787 mov dword ptr [ebp-174h],esp
0041178D push offset string "COM3" (4198C8h)
00411792 call std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> > (41131Bh)
00411797 mov dword ptr [ebp-17Ch],eax
0041179D lea ecx,[ebp-11h]
004117A0 call dword ptr [__imp_CVideoAnnotation::CVideoAnnotation (41D4DCh)]
004117A6 mov dword ptr [ebp-180h],eax
004117AC mov dword ptr [ebp-4],0
CVideoAnnotation::CVideoAnnotation(std::string aPort, DWORD aBaudRate)
{
100137F0 push ebp
100137F1 mov ebp,esp
100137F3 push 0FFFFFFFFh
100137F5 push offset __ehhandler$??0CVideoAnnotation@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@Z (1001DC82h)
100137FA mov eax,dword ptr fs:[00000000h]
10013800 push eax
10013801 sub esp,164h
10013807 push ebx
10013808 push esi
10013809 push edi
1001380A push ecx
1001380B lea edi,[ebp-170h]
10013811 mov ecx,59h
10013816 mov eax,0CCCCCCCCh
1001381B rep stos dword ptr es:[edi]
1001381D pop ecx
1001381E mov eax,dword ptr [___security_cookie (10026090h)]
10013823 xor eax,ebp
10013825 mov dword ptr [ebp-10h],eax
10013828 push eax
10013829 lea eax,[ebp-0Ch]
1001382C mov dword ptr fs:[00000000h],eax
10013832 mov dword ptr [ebp-18h],ecx
10013835 mov dword ptr [ebp-84h],0
1001383F mov dword ptr [ebp-4],0
如果您在單獨的DLL中實現CVideoAnnotation,那么在使用STL容器時,您就會知道跨越DLL邊界的問題。 要驗證是否是這種情況,請創建一個新的構造函數,使用const char *而不是std :: string並嘗試..
另一件事,而不是std :: string更喜歡使用const std :: string&
將string
傳入和傳出DLL應該可以正常工作。 如上所述,以這種方式使用STL容器可能會有問題,但string
很好。
除了Intellisense之外,你有什么證據表明字符串搞砸了嗎? 在發布版本中,Intelliesnse可以是粗略的。 嘗試添加cout << aPort << endl;
進入該構造函數以確保。
如果它確實是不正確的,我只是從調用者調試到構造函數調用 - 查看string
被推送到參數的位置,並查看它在拾取器中的哪個位置以便在構造函數中使用。 假設DLL和app都使用相同版本的C ++運行時,這里的某些東西必須不同步,你應該能夠通過檢查匯編代碼來告訴原因。
“COM3”不是std :: string,它是一個const char *,嘗試創建一個std :: string來傳入。
我也正在打擊看起來像壞字節對齊的結果。 根據這里的建議,跨越庫邊界可能會有問題,我懷疑(即使我使用靜態庫而不是DLL),我可能正在處理同樣的問題。 我在一個庫中實例化一個類,其代碼在另一個庫中。 當我將實例化移動到其代碼所在的庫中時,問題就消失了。 我不明白為什么會這樣,但至少我現在可以前進了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.