Ошибка в std::basic_string в специальном случае распределителя

#c #c 11 #allocator

#c #c 11 #распределитель

Вопрос:

Я использую g и определил пользовательский распределитель, где size_type равен byte. Я использую его с basic_string для создания пользовательских строк.

Код «basic_string.tcc» ведет себя ошибочно, потому что в коде

 _S_create(size_type __capacity, size_type __old_capacity, const _Allocamp; __alloc) 
  

код проверяет наличие

 const size_type __extra = __pagesize - __adj_size % __pagesize;
  

Но вся арифметика является байтовой арифметикой, и поэтому __pagesize то, что должно иметь значение 4096, становится 0 (потому что 4096 кратно 256), и у нас есть исключение «деление на 0» (код зависает).

Вопрос не в том, что мне делать, а в том, как я мог бы попросить исправить приведенный выше код? от кого? (Я могу реализовать эти исправления).

Комментарии:

1. Пример кода не обновляется __pagesize , поэтому ваше утверждение «__pagesize … становится «зависающим в воздухе, неподдерживаемым». Почему бы не опубликовать соответствующий код.

2. @Cheersandhth. -Если в коде libray указано const size_type __pagesize .

3. Почему size_type определяется как char?

4. Учитывая, что libstdc basic_string в любом случае не соответствует стандарту, это может быть напрасной тратой усилий. Вы пробовали то же самое с __versa_string ?

5. @Zacrath стандартная библиотека позволяет определяемым пользователем распределителям ограничивать размер всех связанных объектов и определять их собственный size_type, по-видимому, потому, что в этом есть законная необходимость, а не просто из любви к чрезмерной конфигурируемости.

Ответ №1:

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

Вопрос в том, при каких обстоятельствах было бы законно (или полезно) определять size_type как символ без знака? Я не знаю ничего в стандарте, что конкретно запрещает этот выбор. Это определяется как

целочисленный тип без знака — тип, который может представлять размер самого большого объекта в модели распределения.

И unsigned char это определенно unsigned integer type согласно s3.9.1. Интересно.

Так полезно ли это? Очевидно, вы, кажется, так думаете, но я не уверен, что ваш случай четко изложен. Вы могли бы поработать над предоставлением доказательств того, что эту проблему стоит решить.

Итак, мне кажется, что процесс:

  1. Установите, предназначено ли unsigned char для включения в качестве допустимого выбора в стандарт, или же оно должно быть исключено, или было просто упущено из виду.
  2. Поднимите проблему «несоответствия стандартам» с командой для каждого компилятора, у которого возникла проблема, предоставив веские аргументы и пример воспроизведения.
  3. Рассмотрите возможность отправки исправления, если это в ваших силах исправить.

Или вы могли бы просто использовать short unsigned int вместо этого. Я бы.

Комментарии:

1. В соответствии с моими потребностями, я уже закомментировал код с помощью простого {if(std::numeric_limits<size_type>::max()>=__pagesize_def){ const size_type __extra = __pagesize — __adj_size % __pagesize; __capacity = __extra / sizeof(_CharT); } Поэтому я спрашиваю где я должен запросить этот патч. Что касается факта соответствия стандарту и т.д., то ясно и незамедлительно, что это всего лишь простая ошибка, независимо от какого-либо стандарта или других соображений, ее просто нужно исправить и перейти к более интересной работе и аргументам. Более того, ошибка вернется снова в shorts, если page_size>65536.

2.Попробуйте gnu.org/software/gcc/bugs или gcc.gnu.org/onlinedocs/libstdc /manual/….