У меня есть программа ~ 15'000 строк C/C++ и где-то в ней - простой массив используется вне границ (его догадка), причина "неопределенного поведения" (ну, нет, мой cdrom не открывается случайно), но память кучи изменяется где-то в коде! некоторая определенная целая память просто переходит в несходные случайные исключения памяти, где это не должно происходить, и если я удаляю или изменяю что-либо, исключения происходят в другом месте, странно и прерывисто... Итак, мне нужно заменить 100 массивов на что-нибудь, что бы правильно проверять границы, И что-то потребует минимальных изменений.
Могу ли я создать класс, который имитирует поведение массивов, но проверяет границы, поэтому я могу легко изменить все массивы? или какое решение в этом случае вы бы предложили? Я новичок в C++, любые примеры для меня - золото.
Я использую Windows 7, говоря простым массивом:
int data[400];
data[20] = 4; // its fine
data[-13] = 9; // opens cdrom, or formats hard drive, or works till your windows gets updated
Неожиданная модификация памяти кучи может быть вызвана нарушениями границ массива.
Это также может быть связано с разыгрыванием оборванных указателей. По моему опыту, это еще более вероятно.
Через 15000 строк кода самым быстрым способом решения этой загадки было бы потратить время на то, как использовать инструмент, например valgrind.
Поскольку вы говорите, что вы новичок в C++, вы должны заметить, что стандартные контейнеры шаблонов библиотеки (например, std::array
), основанные на границах, для циклов и интеллектуальных указателей далеко продвигаются, чтобы предотвратить как проблемы, которые я упоминаю.
простой, безопасный массив c++, который проверяет границы... вы слышали о std :: array?
Самое простое, что вы можете попробовать - это связать с отладочной библиотекой malloc. Никаких изменений кода, и он, вероятно, поймает перерасход в массивах, распределенных кучами. Если никакие уловы тогда, вероятно, это что-то плохое в стеке
В Linux больше всего используется электрический забор, мне очень помогли
Есть порты этой библиотеки для Windows,
std::array