2014-09-26 5 views
0

Хорошо, так что это довольно странно.RtlFreeHeap Недействительный адрес при освобождении памяти после передачи указателя на внешний метод библиотеки

Я динамически выделяю память на C с помощью malloc, а затем вызываю метод, определенный внутри библиотеки, с которой я связан.

Проблема, которую я получаю, не может быть освобождена после того, как я вызвал метод, но это нормально, если я освобожу его до вызова этого метода.

Код:

unsigned char* pData = (unsigned char*)malloc(sizeof(unsigned char)*(sLen + 1)); 
pData[0] = CRITICAL_ERROR; // defined as 2 
memcpy(pData+1, pBuf, sLen); 
libwebsocket_write(pLws, pData, sLen + 1, LWS_WRITE_BINARY); 
free(pData); 

необработанное исключение брошено, когда я звоню free(pData).

Я пробовал компилировать библиотеку с той же ОС, arch и строить конфигурацию (Release) как мое приложение, но это не сработало.

EDIT: Я просто сравнил адрес указателя до и после вызова libwebsocket_write, и это то же самое.

ответ

2

Вы посмотрите на documentation в котором говорится, что можно:

ЬиЕ, данные для отправки. Для данных, отправляемых по соединению в сети (т. Е. Не по умолчанию http), этот буфер ДОЛЖЕН иметь LWS_SEND_BUFFER_PRE_PADDING байты, действительные перед указателем, и дополнительные байты LWS_SEND_BUFFER_POST_PADDING, действительные в буфере после (buf + len). Это значит, что заголовок протокола и данные трейлера могут быть добавлены на месте.

Вы не предоставляете это дополнение. Память кучи перед указателем, который содержит внутренний размер разнесенного буфера, изменяется вызовом функции, а затем освобождается.