The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Выделение и освобождение памяти в so модулях"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Выделение и освобождение памяти в so модулях"  
Сообщение от oaealex on 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] ; }

Алексей.

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

delete Mas;

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Алексей.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

Алексей.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру