URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6978
[ Назад ]

Исходное сообщение
"Выделение и освобождение памяти в so модулях"

Отправлено oaealex , 27-Ноя-07 13:35 
Есть разделяемая библиотека (.so) модуль. Коокктно ли будет выделять память в динамической библиотеке, а освобождать в основном исполняемом модуле ?
А наоборот ?
Например:
Основной модуль:
void *H=dlopen("./mymodule.so") ;
char *(*F)() = dlsym(H,"MyFunc") ;
char *Mas=F() ;
... //
delete [] F ; // Корректно ли это удаление ?

Библиотека:

extern "C" char *F() { return new char[100] ; }

Алексей.


Содержание

Сообщения в этом обсуждении
"Выделение и освобождение памяти в so модулях"
Отправлено Michelnok , 27-Ноя-07 14:09 
>char *Mas=F() ;
>... //
>delete [] F ; // Корректно ли это удаление ?

Видимо имелось в виду

delete Mas;

>Библиотека:
>
>extern "C" char *F() { return new char[100] ; }


"Выделение и освобождение памяти в so модулях"
Отправлено oaealex , 27-Ноя-07 14:34 
>>char *Mas=F() ;
>>... //
>>delete [] F ; // Корректно ли это удаление ?
>Видимо имелось в виду
>delete Mas;

Да, конечно "delete [] Mas". Опечатка :(
Почему спрашиваю - потому что в винде это место (выделение памяти в DLL -
освобождение в основном модуле) не тривиально.


"Выделение и освобождение памяти в so модулях"
Отправлено Michelnok , 27-Ноя-07 15:06 
>Почему спрашиваю - потому что в винде это место
>(выделение памяти в DLL - освобождение в основном модуле) не тривиально.

Угу. Из-за того что runtime library в DLL и EXE как правило различаются. Совместимы только на уровне HeapAlloc. Теоретически в юниксах тоже могут различаться (?), но как правило используется одна и та же. Так что проблем быть не должно. Хотя лично я бы так не делал. Или пусть основной модуль выделяет перед вызовом F(), или пусть библиотека освобождает, экспортируя еще одну функцию.


"Выделение и освобождение памяти в so модулях"
Отправлено oaealex , 27-Ноя-07 15:17 
>Угу. Из-за того что runtime library в DLL и EXE как правило
>различаются. Совместимы только на уровне HeapAlloc. Теоретически в юниксах тоже могут
>различаться (?), но как правило используется одна и та же. Так
>что проблем быть не должно. Хотя лично я бы так не
>делал. Или пусть основной модуль выделяет перед вызовом F(), или пусть
>библиотека освобождает, экспортируя еще одну функцию.

Да, это понятно - это совершенно безопасно, но не хочется
"натягивать на свечку дополнителную защиту" :)
Да и код становится более сложным и череватый ошибками.

В принципе проблеммы могут быть в случае статической компоновки
всех библиотек в исполняемом модуле (опция -static-libgcc),
но если ее нет - тогда код и данные освобождения - выделения памяти будут
одними и темеже - а значит проблемм быть не должно. Собственно в винде
(CBuilder) вроде как именно так.

Алексей.


"Выделение и освобождение памяти в so модулях"
Отправлено oaealex , 27-Ноя-07 15:18 

>Угу. Из-за того что runtime library в DLL и EXE как правило
>различаются. Совместимы только на уровне HeapAlloc. Теоретически в юниксах тоже могут
>различаться (?), но как правило используется одна и та же. Так
>что проблем быть не должно. Хотя лично я бы так не
>делал. Или пусть основной модуль выделяет перед вызовом F(), или пусть
>библиотека освобождает, экспортируя еще одну функцию.

Да, это понятно - это совершенно безопасно, но не хочется
"натягивать на свечку дополнителную защиту" :)
Да и код становится более сложным и череватый ошибками.

В принципе проблеммы могут быть в случае статической компоновки
всех библиотек в исполняемом модуле (опция -static-libgcc),
но если ее нет - тогда код и данные освобождения - выделения памяти будут
одними и темеже - а значит проблемм быть не должно. Собственно в винде
(CBuilder) вроде как именно так.

Алексей.