Итак, я выследил раздражающее повреждение кучи одним методом.
DWORD gdwCounter = 0;
TCHAR* GetName(const TCHAR* format, size_t len)
{
len += (snprintf(NULL, 0, "%lu", gdwCounter) * sizeof(TCHAR));
TCHAR *c = (TCHAR*)malloc(len);
_stprintf_s(c, len, __TEXT("%s%lu"), format, gdwCounter);
return c;
}
Чтобы убедиться, что я нашел правильный метод, я попытался изменить его и просто скопировать буфер «формата», который он передает в качестве параметра в выходной буфер. Повреждение кучи исчезло, и все снова стало хорошо.
Я решил посмотреть документацию snprintf и _stprintf_s.
Предполагается, что snprintf возвращает необходимые символы без завершающего нуля символа, чтобы фактически распечатать ваш буфер во втором вызове.
Мой параметр len уже содержит полный размер (с завершающим нулем символом) format.
Также я не смог найти намеков на то, что не так в документации _stprintf_s.
Так что же я упускаю?
Изменить: после дальнейшего тестирования я обнаружил, что _stprintf_s вызывает ошибку, так как snprintf возвращает правильный размер.
TCHAR
уже устарел к моменту выхода библиотеки Unicode для Windows 98 более 20 лет назад. Почему вы используетеTCHAR
?!?! - person Dai   schedule 14.12.2019