Константа-корректность и неизменяемые выделенные объекты

Во время недавнего обсуждения (см. комментарии к этот ответ ), R .. рекомендовал никогда не создавать псевдонимы для указателя на- типов const , поскольку вы не сможете легко освободить объекты, на которые ссылаются, в соответствующей программе на C (помните: free () принимает аргумент указателя, не являющийся const и C99 6.3.2.3 допускают преобразование только из неквалифицированного в квалифицированный ).

Язык C, очевидно, предполагает наличие владельца для любого выделенного объекта, то есть кто-то где-то должен хранить не const указатель на объект, и этот кто-то отвечает за освобождение.

Теперь рассмотрим библиотеку, выделяющую и инициализирующую объекты, которые не могут быть изменены из кода пользовательского пространства, поэтому вызовы функций всегда возвращают указатели, соответствующие const .

Очевидно, библиотека является владельцем объекта и должен сохранять указатель, отличный от const , что несколько глупо, поскольку пользователь уже предоставляет вполне допустимую, но const копию указателя при каждом вызове библиотеки.

Освободить такой указатель. объект, библиотека должна удалить квалификатор const ; насколько я могу судить, следующее

void dealloc_foo(const struct foo *foo)
{
    free((void *)foo);
}

верно для C; он был бы недействителен только в том случае, если бы параметр foo был дополнительно квалифицирован restrict -квалифицирован.

Однако удаление const кажется несколько взломанным.

Есть ли другой способ, кроме удаления const из всех возвращаемых значений библиотечных функций, что приведет к потере любой информации об изменчивости объекта?

6
задан Community 23 May 2017 в 09:58
поделиться