簡體   English   中英

C ++ std :: string參數是<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM