C ++ std :: string参数是<bad ptr =“”> </bad>

时间:2010-12-01 00:32:55

标签: c++ visual-c++

我正在使用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  

4 个答案:

答案 0 :(得分:4)

如果您在单独的DLL中实现CVideoAnnotation,那么在使用STL容器时,您就会知道跨越DLL边界的问题。要验证是否是这种情况,请创建一个新的构造函数,使用const char *而不是std :: string并尝试..

另一件事,而不是std :: string更喜欢使用const std :: string&amp;

答案 1 :(得分:2)

string传递给DLL并从DLL传递应该可以正常工作。如上所述,以这种方式使用STL容器可能会有问题,但string很好。

你是否有任何超越Intellisense的证据表明字符串搞砸了?在发布版本中,Intelliesnse可以是粗略的。尝试将cout << aPort << endl;添加到该构造函数中以确保。

如果确实不正确,我只是从调用者调试到构造函数调用 - 看看string作为参数被推送到哪里,并查看它在拾取器中的哪个部分用于构造函数内部。假设DLL和应用程序使用相同版本的C ++运行时,这里的某些内容必须不同步,您应该能够通过检查汇编代码来告诉原因。

答案 2 :(得分:0)

“COM3”不是std :: string,它是一个const char *,尝试创建一个std :: string来传入。

答案 3 :(得分:0)

我也正在打击导致错误的字节对齐。根据这里的建议,跨越库边界可能会有问题,我怀疑(即使我使用静态库而不是DLL),我可能正在处理同样的问题。我在一个库中实例化一个类,其代码在另一个库中。当我将实例化移动到其代码所在的库中时,问题就消失了。我不明白为什么会这样,但至少我现在可以前进了。