Я использую Visual C++ 2017 для создания приложения OpenGL/GLFW. Однако я получаю сбой в операторе delete[] с сообщением «ОБНАРУЖЕНО ПОВРЕЖДЕНИЕ КУЧИ: [...] CRT обнаружил, что приложение записывает в память после окончания буфера кучи». в следующей функции я написал:
#include <direct.h>
void setwd(char **argv)
{
char *buf = new char[strlen(argv[0])];
strcpy(buf, argv[0]);
// Handle both possible separators
char *p = strrchr(buf, '/');
if (!p)
p = strrchr(buf, '\\');
if (p)
{
*(p + 1) = '\0';
_chdir(buf);
}
delete[] buf;
}
Если я удалю свой звонок на setwd, все будет нормально. При отладке я убедился, что strlen(argv[0]) никогда не равен 0.
Стоит отметить, что это отлично работает, если скомпилировано с помощью MSYS2/gcc.
Уменьшите количество дефектов и используйте std::string для текста. std::string автоматически управляет памятью для вас и имеет методы поиска и замены.
Не занимайтесь собственным управлением памятью. Оставьте это разработчикам низкоуровневых структур. Используйте строки/векторы, чтобы сделать это за вас.





Вам нужен один дополнительный символ в буфере для нулевого терминатора: new char[strlen(argv[0])+1]
Хорошо, это работает. Глупая ошибка, но почему он отлично работал на MSYS, и, прежде всего, почему он ждал, пока не сработает оператор delete[]? Это вводит в заблуждение.
@Matrefeytontias это неопределенное поведение, поэтому то, что именно произойдет, зависит от конкретных деталей вашей реализации. В этом случае распределители кучи вашей стандартной библиотеки, вероятно, сохраняют что-то полезное после каждого блока памяти, возвращаемого из new (например, размер выделения или указатель на следующий в каком-то списке выделенных объектов), и вы перезаписали Это. Затем, когда реализация пытается прочитать эту информацию, она запутывается. Используя другую цепочку инструментов, ваши новые/удаленные реализации могут работать по-другому и работать нормально.
Достаточно хорошо для меня. Спасибо за объяснение !
@Matrefeytontias Я поддерживаю рекомендацию других использовать std::string вместо необработанных массивов символов. Их намного проще использовать правильно, не вызывая ошибок, в основном потому, что они автоматически управляют своей собственной памятью, и вам не нужно об этом беспокоиться.
Выключен из-за одной ошибки. Буфер слишком мал для хранения строки.