Это консольное приложение (x64). Вот фрагмент кода:
if (RecvAnswer(wsarecvBuf, &NumberOfBytesRecvd) == 0 && wsasendBuf.len > 0) {
std::string str(wsarecvBuf.buf + 20);
std::string needle("SessionID");
std::size_t found = str.find(needle) + 14;
std::string sID = str.substr(found, 10);
strcpy_s(SessionID, sID.c_str());
printf("Session id: %s\n\n", SessionID);
}
При выходе из оператора if вызывается функция ms delete_scalar.cpp:
CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
#ifdef _DEBUG
_free_dbg(block, _UNKNOWN_BLOCK);
#else
free(block);
#endif
}
Когда я отлаживаю функцию _free_dbg, выдается исключение. Блок мой std :: string str. Работа без отладки (блокировка) Функция работает для того же блока.
Мой std :: string needle и sID не вызывают delete (void * const block). Возможно, проблема безопасности для str.
Для информации
int RecvAnswer(WSABUF wsarecvBuf, LPDWORD pNumberOfBytesRecvd)
{
int err = 0;
int iResult = 0;
DWORD Flags = 0;
err = 0;
DWORD cTransfer = 0;
wsarecvBuf.len = RECV_BUF;
ZeroMemory(wsarecvBuf.buf, RECV_BUF);
iResult = WSARecv(sfd, &wsarecvBuf, 1, pNumberOfBytesRecvd, &Flags, &RecvOverlapped, NULL);
if ((iResult == SOCKET_ERROR) && (WSA_IO_PENDING != (err = WSAGetLastError()))) {
printf("WSARecv failed with error: %d\n", err);
return 1;
}
iResult = WSAWaitForMultipleEvents(1, &RecvOverlapped.hEvent, TRUE, INFINITE, TRUE);
if (iResult == WSA_WAIT_FAILED) {
wprintf(L"WSAWaitForMultipleEvents failed with error: %d\n", WSAGetLastError());
return 1;
}
iResult = WSAGetOverlappedResult(sfd, &RecvOverlapped, &cTransfer, FALSE, &Flags);
if (iResult == FALSE) {
wprintf(L"WSARecv operation failed with error: %d\n", WSAGetLastError());
return 1;
}
*pNumberOfBytesRecvd = cTransfer;
WSAResetEvent(RecvOverlapped.hEvent);
return 0;
}
Любая идея, как решить эту проблему.
РЕДАКТИРОВАТЬ: Это сокет программирования.
WSABUF wsarecvBuf;
char* recvbuf;
recvbuf = (char*)malloc(RECV_BUF);
if (recvbuf) {
memset(recvbuf, 0, RECV_BUF);
wsarecvBuf.len = RECV_BUF;
wsarecvBuf.buf = recvbuf;
}
Точка останова на строке} после printf сгенерирует следующую сборку после}:
0007FF68883991B lea rcx,[rbp+14F8h]
00007FF688839922 call std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> > (07FF6888314DDh)
00007FF688839927 nop
00007FF688839928 lea rcx,[rbp+1498h]
00007FF68883992F call std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> > (07FF6888314DDh)
00007FF688839934 nop
00007FF688839935 lea rcx,[rbp+1458h]
00007FF68883993C call std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> > (07FF6888314DDh)
00007FF688839941 jmp main+0CDCh (07FF68883996Ch)
Это не мой код, это код ms, выделяющий std :: string.