Исключение выбрасывается, когда freeint std :: string - PullRequest
0 голосов
/ 24 октября 2019

Это консольное приложение (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.

...