StringBuffer в пределах GetString. Это должно быть уничтожено в конце объема GetString (т.е. когда это возвращается). Кроме того, я не полагаю, что C++ будет гарантии, что переменная будет существовать, пока существует ссылка.
следующее должно скомпилировать:
Object* obj = new Object;
Object& ref = &(*obj);
delete obj;
Можете ли вы заменить глобальный одномерный массив ubyte объектом с перегруженным оператором []? Использование абсолютного значения ввода int может решить некоторые из ваших проблем.
Изменить: в зависимости от схемы использования вашего массива (без махинаций с указателем) использование объекта с перегруженным оператором [] может быть полностью прозрачным для пользователей массива, отсюда и мое предложение.
Может работать какая-то проверка использования памяти, особенно если вы можете принудительно массив на его собственную страницу. Я бы использовал valgrind
в Linux, не уверен, что вы будете использовать в Windows - purify
?
Знаете ли вы границы индексов?
Читая комментарий под ответом Siyfion, кажется, что отрицательные индексы разрешены в вашей проблемной области, и поэтому нет смысла пытаться заставить все показатели положительные. Лучшее решение - разрешить отрицательные индексы без нарушения каких-либо языковых правил (что, кстати, и в вашей версии C. Вам просто повезло, что он не взорвался;))
Итак, если вы знаете, что индексы, которые вы собираетесь использовать находятся в диапазоне от -x до y, просто создайте массив размером x + y и используйте указатель на x-й элемент при доступе к массиву.
Например, если вам нужен массив с индексами от -4 до 5:
int arr[10];
int* ptr = arr+4;
// use ptr when you need to index into the array:
ptr[-4]; // is valid, reads arr[0]
ptr[5]; // is valid, reads arr[9]
Конечно, то же самое можно (и должно было) сделать в C.
Еще один совет - не обращаться к необработанному массиву напрямую. Вместо этого определите простые функции доступа.
Есть ли способ во время выполнения для меня для обнаружения любых случаев доступа массивы с отрицательными индексами?
Замените глобальный массив на std :: vector . Замените использование синтаксиса array [index]
на
vector.at(index)
. Это делает именно то, что вы просите: добавляет проверки привязки массива во время выполнения.
единственный способ, который я могу придумать, - это обернуть массив методом, проверяющим положительный индекс.
Лично я бы попытался разобраться, почему любой из ваших индексов может быть отрицательным; очевидно, что они вернут неправильное значение, так что вы не должны позволить индексу стать отрицательным?
Исправьте код, который позволяет им стать отрицательным, вместо того, чтобы пытаться вставить квадратную заглушку в круглое отверстие (чтобы говорить);)
Заверните. В качестве альтернативы проверьте, поддерживает ли ваш компилятор проверку границ. В худшем случае я бы не поместил допустимые значения в ваш массив с отрицательными числами. Я бы поставил явно неправильные значения, чтобы вы получили явно неправильное значение, когда это произойдет. Вы не определите проблему без отладчика, но, по крайней мере, у вас есть четкое предупреждение, что где-то это делает какой-то код.
Единственное, что вы можете сделать, это проверить, до какого минимального значения идут ваши индексы, и начать заполнять массив с этого индекса.
a [-i] = * (a - i)
, так что начните с (ai) в качестве базового адреса вместо (a), чтобы вы просто сместили свой массив и получили желаемые значения.