Доступ к массиву с отрицательным числом!

StringBuffer в пределах GetString. Это должно быть уничтожено в конце объема GetString (т.е. когда это возвращается). Кроме того, я не полагаю, что C++ будет гарантии, что переменная будет существовать, пока существует ссылка.

следующее должно скомпилировать:

Object* obj = new Object;
Object& ref = &(*obj);
delete obj;
14
задан jalf 14 September 2009 в 12:47
поделиться

8 ответов

Можете ли вы заменить глобальный одномерный массив ubyte объектом с перегруженным оператором []? Использование абсолютного значения ввода int может решить некоторые из ваших проблем.

Изменить: в зависимости от схемы использования вашего массива (без махинаций с указателем) использование объекта с перегруженным оператором [] может быть полностью прозрачным для пользователей массива, отсюда и мое предложение.

26
ответ дан 1 December 2019 в 06:35
поделиться

Может работать какая-то проверка использования памяти, особенно если вы можете принудительно массив на его собственную страницу. Я бы использовал valgrind в Linux, не уверен, что вы будете использовать в Windows - purify ?

4
ответ дан 1 December 2019 в 06:35
поделиться

Знаете ли вы границы индексов?

Читая комментарий под ответом 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.

Еще один совет - не обращаться к необработанному массиву напрямую. Вместо этого определите простые функции доступа.

6
ответ дан 1 December 2019 в 06:35
поделиться

Есть ли способ во время выполнения для меня для обнаружения любых случаев доступа массивы с отрицательными индексами?

Замените глобальный массив на std :: vector . Замените использование синтаксиса array [index] на

vector.at(index)

. Это делает именно то, что вы просите: добавляет проверки привязки массива во время выполнения.

3
ответ дан 1 December 2019 в 06:35
поделиться

единственный способ, который я могу придумать, - это обернуть массив методом, проверяющим положительный индекс.

2
ответ дан 1 December 2019 в 06:35
поделиться

Лично я бы попытался разобраться, почему любой из ваших индексов может быть отрицательным; очевидно, что они вернут неправильное значение, так что вы не должны позволить индексу стать отрицательным?

Исправьте код, который позволяет им стать отрицательным, вместо того, чтобы пытаться вставить квадратную заглушку в круглое отверстие (чтобы говорить);)

1
ответ дан 1 December 2019 в 06:35
поделиться

Заверните. В качестве альтернативы проверьте, поддерживает ли ваш компилятор проверку границ. В худшем случае я бы не поместил допустимые значения в ваш массив с отрицательными числами. Я бы поставил явно неправильные значения, чтобы вы получили явно неправильное значение, когда это произойдет. Вы не определите проблему без отладчика, но, по крайней мере, у вас есть четкое предупреждение, что где-то это делает какой-то код.

3
ответ дан 1 December 2019 в 06:35
поделиться

Единственное, что вы можете сделать, это проверить, до какого минимального значения идут ваши индексы, и начать заполнять массив с этого индекса.

a [-i] = * (a - i)

, так что начните с (ai) в качестве базового адреса вместо (a), чтобы вы просто сместили свой массив и получили желаемые значения.

0
ответ дан 1 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: