C ++ std :: string Параметр is - PullRequest
       5

C ++ std :: string Параметр is

3 голосов
/ 01 декабря 2010

Я использую 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>.

У кого-нибудь есть мысли о том, почему строка не проходит должным образом?

Спасибо, Dave

В качестве обновления к моему первоначальному вопросу я добавляю ассемблерный код для вызова конструктора и совокупность локальных элементов один раз внутри конструктора.

   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 ]

4 голосов
/ 01 декабря 2010

Если вы реализуете CVideoAnnotation в отдельной DLL, тогда у вас есть хорошо известная проблема пересечения границ DLL при использовании контейнеров STL.Чтобы убедиться, что это так, создайте новый конструктор, взяв const char * вместо std :: string и попробуйте ..

Другое дело, вместо std :: string предпочитайте использовать const std :: string &

2 голосов
/ 01 декабря 2010

Передача string в и из DLL должна работать нормально. Как отмечалось выше, использование контейнеров STL таким способом может быть проблематичным, но string хорошо.

Есть ли у вас какие-либо доказательства помимо Intellisense, что строка запуталась? В сборках Release Intelliesnse может быть отрывочным. Попробуйте добавить cout << aPort << endl; в этот конструктор, чтобы убедиться.

Если это действительно неверно, я бы просто отладил от вызывающей стороны вызов конструктора - посмотрите, где string передается в качестве параметра, и посмотрите, где в стеке он взят для использования внутри конструктора. Здесь что-то должно быть не синхронизировано, если предположить, что и DLL, и приложение используют одну и ту же версию сред выполнения C ++, и вы сможете понять причину, проверив код ассемблера.

0 голосов
/ 26 октября 2011

Я тоже боролся с тем, что выглядело как неправильное выравнивание байтов, что привело к. Основываясь на предложениях о том, что пересечение границ библиотеки может быть проблематичным, я подозревал (хотя я использую статическую библиотеку вместо DLL), что я могу иметь дело с такой же проблемой Я создавал экземпляр класса в одной библиотеке, чей код был в другой. Когда я переместил экземпляр в библиотеку, где был код, проблема ушла. Я не понимаю, почему это сработало, но, по крайней мере, теперь я могу двигаться вперед.

0 голосов
/ 01 декабря 2010

"COM3" - это не std :: string, это const char *, попробуйте создать std :: string для передачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...