Использует const_cast для доступа только для чтения к позволенному объекту константы?

Доступ MS не освобождает пространство, использованное записями даже после того, как они будут удалены. Можно освободить пространство вручную, когда Вы должны или автоматически каждый раз, когда Вы закрываете приложение.

, Чтобы сделать это вручную, используйте утилиту Compact и Repair:

  1. Резервное копирование Ваша база данных, как существует ошибка в Access 2007 , который может удалить Вашу базу данных во время процедуры уплотнения.

  2. при уплотнении многопользовательской (общей) базы данных, которая расположена на сервере или совместно используемой папке, удостоверьтесь, что ни у кого больше нет ее открытый.

  3. В меню Tools, укажите на Утилиты Базы данных, и затем нажмите Compact и Repair Database.

, Чтобы сделать это автоматически, когда Вы закрываете приложение:

  1. Открывают базу данных, что Вы хотите Доступ MS к компактному автоматически.

  2. В меню Tools, нажмите Options, и затем выберите вкладку "Общие".

  3. Выбор Компактное На поле Строгого контроля.

После удаления данных и уплотнения базы данных не удивлены, еще больше ли, чем 100 КБ. Существует определенное количество издержек, которые не могут быть удалены после добавления данных в первый раз.

кроме того, остерегайтесь того AutoNumber, значения полей ведут себя по-другому, чем рекламируемый после процедуры уплотнения: Согласно документации Access 2000 MS, если Вы удаляете записи из конца таблицы, которая имеет поле AutoNumber, уплотняя базу данных, сбрасывает Значение с автонумерацией. Таким образом, Значение с автонумерацией следующей записи, которую Вы добавляете, будет одним большим, чем Значение с автонумерацией последней восстановленной после удаления записи в таблице.

я имею не , нашел, что это имело место: Если Вы имеете 100 Автоматически пронумерованных записей и удаляете последние 50, следующая запись AutoNumber (согласно документации) должна быть пронумерована "51". Но по моему опыту это пронумеровано "101", вместо этого.

6
задан Kevin Panko 19 December 2009 в 01:43
поделиться

5 ответов

Да, это разрешено (если опасно!). Фактическая запись в объект const вызывает неопределенное поведение, а не само приведение (7.1.5.1/4 [dcl.type.cv]).

Как стандартные примечания в 5.2.11 / 7 [expr.const.cast], в зависимости от типа объекта попытка записи через указатель, которая является результатом отбрасывания const , может привести к неопределенному поведению.

14
ответ дан 8 December 2019 в 16:05
поделиться

Поскольку ваш код не изменяет массив, и вы сказали компилятору, что знаете, что делаете, используя const_cast , все будет в порядке. Однако я считаю, что вы технически вызываете неопределенное поведение. Лучше всего зафиксировать объявление функции или написать, объявить и использовать ее безопасную для констант версию.

1
ответ дан 8 December 2019 в 16:05
поделиться

Yes, you can do that. No, it is not undefined behavior as long as the function truely does not try to write to the array.

1
ответ дан 8 December 2019 в 16:05
поделиться

Использование const_cast для объекта, который изначально определен как const - это UB, поэтому неопределенное поведение проявляется сразу в точке, которую вы вызываете const_cast .

-2
ответ дан 8 December 2019 в 16:05
поделиться

Проблема с const_cast всегда одна и та же - она ​​позволяет «нарушать правила», точно так же, как приведение к void * и обратно. - Конечно, вы можете это сделать, но вопрос в том, зачем вам?

В этом случае это, конечно, нормально, но вы должны спросить себя, почему вы не объявили size_t countZeroes (const int * array, size_t count) в первую очередь?

И как общее правило о const_cast :

  1. Это может вызвать затруднения для поиска ошибок
  2. Вы отказываетесь от константного соглашения с компилятором
  3. По сути, вы превращаете язык в более низкий. уровень 1.
1
ответ дан 8 December 2019 в 16:05
поделиться
Другие вопросы по тегам:

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