Есть разделяемая библиотека (.so) модуль. Коокктно ли будет выделять память в динамической библиотеке, а освобождать в основном исполняемом модуле ?
А наоборот ?
Например:
Основной модуль:
void *H=dlopen("./mymodule.so") ;
char *(*F)() = dlsym(H,"MyFunc") ;
char *Mas=F() ;
... //
delete [] F ; // Корректно ли это удаление ?Библиотека:
extern "C" char *F() { return new char[100] ; }
Алексей.
>char *Mas=F() ;
>... //
>delete [] F ; // Корректно ли это удаление ?Видимо имелось в виду
delete Mas;
>Библиотека:
>
>extern "C" char *F() { return new char[100] ; }
>>char *Mas=F() ;
>>... //
>>delete [] F ; // Корректно ли это удаление ?
>Видимо имелось в виду
>delete Mas;Да, конечно "delete [] Mas". Опечатка :(
Почему спрашиваю - потому что в винде это место (выделение памяти в DLL -
освобождение в основном модуле) не тривиально.
>Почему спрашиваю - потому что в винде это место
>(выделение памяти в DLL - освобождение в основном модуле) не тривиально.Угу. Из-за того что runtime library в DLL и EXE как правило различаются. Совместимы только на уровне HeapAlloc. Теоретически в юниксах тоже могут различаться (?), но как правило используется одна и та же. Так что проблем быть не должно. Хотя лично я бы так не делал. Или пусть основной модуль выделяет перед вызовом F(), или пусть библиотека освобождает, экспортируя еще одну функцию.
>Угу. Из-за того что runtime library в DLL и EXE как правило
>различаются. Совместимы только на уровне HeapAlloc. Теоретически в юниксах тоже могут
>различаться (?), но как правило используется одна и та же. Так
>что проблем быть не должно. Хотя лично я бы так не
>делал. Или пусть основной модуль выделяет перед вызовом F(), или пусть
>библиотека освобождает, экспортируя еще одну функцию.Да, это понятно - это совершенно безопасно, но не хочется
"натягивать на свечку дополнителную защиту" :)
Да и код становится более сложным и череватый ошибками.В принципе проблеммы могут быть в случае статической компоновки
всех библиотек в исполняемом модуле (опция -static-libgcc),
но если ее нет - тогда код и данные освобождения - выделения памяти будут
одними и темеже - а значит проблемм быть не должно. Собственно в винде
(CBuilder) вроде как именно так.Алексей.
>Угу. Из-за того что runtime library в DLL и EXE как правило
>различаются. Совместимы только на уровне HeapAlloc. Теоретически в юниксах тоже могут
>различаться (?), но как правило используется одна и та же. Так
>что проблем быть не должно. Хотя лично я бы так не
>делал. Или пусть основной модуль выделяет перед вызовом F(), или пусть
>библиотека освобождает, экспортируя еще одну функцию.Да, это понятно - это совершенно безопасно, но не хочется
"натягивать на свечку дополнителную защиту" :)
Да и код становится более сложным и череватый ошибками.В принципе проблеммы могут быть в случае статической компоновки
всех библиотек в исполняемом модуле (опция -static-libgcc),
но если ее нет - тогда код и данные освобождения - выделения памяти будут
одними и темеже - а значит проблемм быть не должно. Собственно в винде
(CBuilder) вроде как именно так.Алексей.