Ближайшее возможное решение заменить массивы чем-то, что могло бы проверить границы c ++

0

У меня есть программа ~ 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
  • 0
    Можете ли вы выпустить часть своего кода, чтобы мы могли видеть?
  • 0
    std::array
Показать ещё 4 комментария
Теги:

3 ответа

0
Лучший ответ

Неожиданная модификация памяти кучи может быть вызвана нарушениями границ массива.

Это также может быть связано с разыгрыванием оборванных указателей. По моему опыту, это еще более вероятно.

Через 15000 строк кода самым быстрым способом решения этой загадки было бы потратить время на то, как использовать инструмент, например valgrind.

Поскольку вы говорите, что вы новичок в C++, вы должны заметить, что стандартные контейнеры шаблонов библиотеки (например, std::array), основанные на границах, для циклов и интеллектуальных указателей далеко продвигаются, чтобы предотвратить как проблемы, которые я упоминаю.

  • 0
    что я сделал: взял std: массив, изменил его для проверки границ по умолчанию с помощью оператора [] и изменил все массивы, чтобы инициализировать мой новый класс массива. после проверки всего я отключу проверку границ по умолчанию везде или только там, где имеет значение оптимизация процессора. найдено 2 массива, которые выходят за пределы, но основной сбой был причиной использования указателя на неправильно инициализированные данные.
1

простой, безопасный массив c++, который проверяет границы... вы слышали о std :: array?

http://en.cppreference.com/w/cpp/container/array/at

0

Самое простое, что вы можете попробовать - это связать с отладочной библиотекой malloc. Никаких изменений кода, и он, вероятно, поймает перерасход в массивах, распределенных кучами. Если никакие уловы тогда, вероятно, это что-то плохое в стеке

В Linux больше всего используется электрический забор, мне очень помогли

Есть порты этой библиотеки для Windows,

http://sourceforge.net/projects/duma/

https://code.google.com/p/electric-fence-win32/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню