См. Вопрос MSO Длинный список возможных дубликатов - распределение памяти C и превышение границ для получения информации о тесно связанных вопросах.
Среда разработки: CentOS 4.7, Kdevelop 3.1.1, gcc 3.4.6
Я запускаю тестовый клиент Java, который загружает совместно используемую библиотеку C ++ с использованием JNI. В моем приложении три компонента:
- Java-клиент
- C ++ разделяемая библиотека, которая действует как оболочка JNI. (Я назову это «библиотека-обертка»)
- C ++ разделяемая библиотека, содержащая бизнес-объекты. (Я назову это "businesslibrary")
Когда я запускаю клиент, я очень часто сталкиваюсь с ошибкой *** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***
. Эта ошибка появляется примерно 10 - 11 раз, а затем приложение запускается.
В моем клиенте Java я сначала загружаю необходимые библиотеки C ++ в статический ctor следующим образом:
static
{
System.Load("/root/Desktop/libs/businesslibrary");
System.out.println("business library loaded");
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}
Оператор "загруженная бизнес-библиотека" печатается на консоли, но после него появляется ошибка *** glibc...
.
В настройках проекта библиотеки-оболочки бизнес-библиотека указывается как зависимая библиотека. Поэтому, даже если я опущу вызов для загрузки businesslibrary и просто напишу,
static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}
затем сначала загружается бизнес-библиотека (это видно по журналу создания глобальной переменной), а затем загружается библиотека-обертка. Элемент управления возвращается обратно к клиенту java, и на консоли выводится оператор «библиотека загружена». После этого происходит звонок
родной метод. Но элемент управления никогда не достигает реализации этого нативного метода. Скорее до этого снова приходит ошибка *** glibc...
. Также, если я вставлю вызов статического метода другого Java-класса перед вызовом нативного метода, например,
static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
System.out.println(Try.temp()); //where temp is a static method of Try class which returns a string.
native method call;
--
--
}
тогда вывод Try.temp () никогда не печатается.
Какие могут быть возможные причины проблемы в обоих этих подходах и как мне действовать?