См. вопрос MSO длинный список возможных дубликатов — выделение памяти C и превышение границ для получения информации о тесно связанных вопросах.
Среда разработки: CentOS 4.7, Kdevelop 3.1.1, gcc 3.4.6
Я запускаю тестовый клиент Java, который загружает общую библиотеку C++ с помощью JNI. В моем приложении есть три компонента,
- Java-клиент
- Общая библиотека C++, которая действует как оболочка JNI. (я назову это «библиотекой-оболочкой»)
- Общая библиотека C++, содержащая бизнес-объекты. (я назову это «бизнес-библиотека»)
Когда я запускаю клиент, я очень часто сталкиваюсь с ошибкой *** 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...
.
В настройках проекта wrapperlibrary бизнес-библиотека указана как зависимая библиотека. Итак, даже если я пропущу вызов загрузки бизнес-библиотеки и просто напишу,
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() никогда не будет напечатан.
Каковы могут быть возможные причины проблемы в обоих этих подходах и как мне действовать?