Это мой первый проект, который мне удалось завершить, поэтому я немного не уверен, как ссылаться на исполняемый файл по сравнению с проектом, над которым работают и отлаживают в режиме отладки, или есть ли несколько способов сделать это и т. д. и т. д.
Однако, чтобы быть более конкретным, я столкнулся с проблемой повреждения кучи, которая возникла только тогда, когда Visual Studio 2019 был установлен в режим выпуска, выплевывает exe-версию моей программы, а затем прошел свой первый сеанс отладки в этой форме. Получается (возможно, я ошибаюсь, но это последнее, что я изменил перед тем, как проблема полностью исчезла), что следующий код:
std::unique_ptr<std::vector<Stat>> getSelStudStats(HWND listboxcharnames) {
std::unique_ptr<std::vector<Stat>> selStats = std::make_unique<std::vector<Stat>>();
int pos = ListBox_GetCurSel(listboxcharnames);
int len = ListBox_GetTextLen(listboxcharnames, pos);
const wchar_t* buffer = new const wchar_t[++len];
ListBox_GetText(listboxcharnames, pos, buffer);
for (int i = 0; i < getSize(); i++) {
Character character = getCharacterPtr(i);
std::wstring name = character.getName();
if (name.compare(buffer) == 0) {
*selStats = character.getAllStats();
return selStats;
}
}
return selStats;
delete[] buffer;
}
не присваивал правильный размер переменной buffer
через len
. При добавлении оператора приращения префикса к len
теперь учитывался нулевой символ завершения, который будет появляться вместе с текстом окна списка; Следовательно, ошибка повреждения кучи перестала возникать.
Хотя я рад, что разобрался с проблемой, я не знаю, почему VS2019 не поднял эту проблему в режиме отладки. Пытаясь отладить проблему, я узнал, что оптимизация в режиме выпуска может изменить структуру и порядок выполнения кода.
Есть ли что-то в этом блоке кода, что могло бы создать ошибку, которая у меня была, но только в режиме выпуска/исполняемой форме?
EDITED: я удалил звездочки, которые изначально окружали ++len
, пытаясь выделить изменение, на которое я ссылаюсь. Приносим извинения за путаницу, которую это, по понятным причинам, вызвало.