Давеча столкнулся с неприятной особенностью при разработке библиотеки на языке Си.
Есть в ней функции, возвращающие указатели на динамически выделенные массивы стандартного типа с помощью malloc(), по большей части это обычные Си-строки. Я рассчитывал, что освобождать эти данные из кода основной программы нужно стандартной функцией free(). Это разумно для компонентной системы, библиотека и программа, ее использующая, динамически подключаются к одной и той же стандартной библиотеке, в результате чего используют согласованные средства для выделения и освобождения памяти.
Основная разработка ведется в Linux, и в ней нарушения этого принципа не наблюдалось. Для любых доступных комбинаций компиляторов (gcc, clang, tcc, tendracc) для библиотеки и приложения никаких накладок не было замечено. Собранная библиотека оказалась переносима между разными версиями дистрибутива.
А вот в Windows меня ждало небольшое разочарование. Библиотеку для нее собирали средствами mingw, а приложение - с помощью Visual Studio. Несмотря на заверения о том, что mingw использует родной для Windows c-runtime, какую-то несовместимость он вносит. При попытке средствами программы освободить память, выделенную в библиотеке, происходит крах.
Есть категоричное мнение, что при правильной архитектуре освобождать нужно теми же средствами, что использовались для выделения. То есть в пару к функции, возвращающей указатель на динамически созданный объект, должна быть создана функция его освобождения. Тогда проблемы рассогласованности не возникнет.
Разумно, тем не менее, я считаю такой подход не всегда адекватным.
Есть в ней функции, возвращающие указатели на динамически выделенные массивы стандартного типа с помощью malloc(), по большей части это обычные Си-строки. Я рассчитывал, что освобождать эти данные из кода основной программы нужно стандартной функцией free(). Это разумно для компонентной системы, библиотека и программа, ее использующая, динамически подключаются к одной и той же стандартной библиотеке, в результате чего используют согласованные средства для выделения и освобождения памяти.
Основная разработка ведется в Linux, и в ней нарушения этого принципа не наблюдалось. Для любых доступных комбинаций компиляторов (gcc, clang, tcc, tendracc) для библиотеки и приложения никаких накладок не было замечено. Собранная библиотека оказалась переносима между разными версиями дистрибутива.
А вот в Windows меня ждало небольшое разочарование. Библиотеку для нее собирали средствами mingw, а приложение - с помощью Visual Studio. Несмотря на заверения о том, что mingw использует родной для Windows c-runtime, какую-то несовместимость он вносит. При попытке средствами программы освободить память, выделенную в библиотеке, происходит крах.
Есть категоричное мнение, что при правильной архитектуре освобождать нужно теми же средствами, что использовались для выделения. То есть в пару к функции, возвращающей указатель на динамически созданный объект, должна быть создана функция его освобождения. Тогда проблемы рассогласованности не возникнет.
Разумно, тем не менее, я считаю такой подход не всегда адекватным.