Код более пяти тысяч строк. LocalFree вылетает с кодом 0xC0000374 (STATUS_HEAP_CORRUPTION), хотя при вызове LocalFree данные по указателю выглядят неповреждёнными. Прошёлся отладчиком по подозрительным местам, но так ничего и не удалось найти, код слишком большой и сложный... Подскажите, пожалуйста, как можно вычислить данную ошибку. Разделить код не предлагать) Это невозможно. Уберёшь хоть одну строчку и работа всех пяти тысяч строк нарушится. P.S. LocalFree вылетает только при очень сложных вычислениях. При относительно простых работает нормально
Сделай обертки для функций работы с памятью по примеру https://github.com/babasuck/baselib/blob/main/src/antileak/antileak.c Код (Text): #define malloc(n) antileak_malloc(n, __FILE__, __LINE__) #define realloc(p, n) realloc_free(p, n, __FILE__, __LINE__) #define free(p) antileak_free(p, __FILE__, __LINE__)
проверка на 0/NULL в free - точно надо печатать? it is perfectly safe to pass a NULL pointer to the free() function in C. According to the C standard, if the pointer passed to free() is NULL, no action is taken This means you don't need to check if the pointer is NULL before calling free(); doing so would just add unnecessary code. --- Сообщение объединено, 16 июл 2024 --- и еще вопрос - как насчет поддетжки МТ? глобально int malloc_sum = 0, free_sum = 0; не есть айс...
На твои данные системе пофиг. Сообщение "куча повреждена" выводится, когда портятся служебные данные перед или после выделенного тобой блока. Переполнение буфера у тебя, короче, перепроверяй расчеты размеров при выделениях памяти (вангую, где-то +1 к длине забыл добавить для строки).
Также можно запустить под AppVerifier’ом: https://learn.microsoft.com/en-us/w...verifier-testing-applications#heap-corruption Или скомпилировать с AddressSanitizer’ом.
Так я использую структуры и обращаюсь только к её членам так, что простое переполнение буфера исключено. И что? Я знаю что повреждается, я даже выяснил, когда примерно это происходит, но я не могу понять как и почему. Ладно.... Мои отладочные кода обнаружили ошибку в другом месте моей формулы. Исправлю пока её. Может та сама пройдёт Хотя вряд ли..... Тогда воспользуюсь некоторыми советами. озвученными тут.
mantissa VS еще маркеров добавляет впереди и сзади и потом из чекает аля вместо Код (C++): typedef struct MemoryBlock { size_t size; char data[]; } MemoryBlock; Код (C++): typedef struct MemoryBlock { uint32_t marker_before; size_t size; char data[]; uint32_t marker_after } MemoryBlock;
Служебные данные в размер size_t size не входят, поэтому пофиг + fam data[] должен быть последним членом структуры.
Оказывается пишется в уже освобождённую память. Даже умудрилось миновать это: Код (Text): VOID LocalFreeStopWrite(HLOCAL hMem) { PVOID Mem; _asm{ mov rax, hMem mov rcx, qword ptr [rax] mov Mem, rcx mov qword ptr [rax], 0 } } Теперь осталось понять, где именно не убирается в двухсвязном списке указатель на освобождённую память, но это уже дело техники