Посмотрите, что MSO подвергает сомнению длинный список возможных дубликатов — C выделение памяти и переполняющиеся границы для получения информации о тесно связанных вопросах.
Среда разработчика: CentOS 4.7, Kdevelop 3.1.1, gcc 3.4.6
Я выполняю тестовый клиент Java, который загружается, C++ совместно использовал библиотеку с помощью JNI. Существует три компонента в моем приложении,
Когда я выполняю клиент, я сталкиваюсь с ошибкой очень часто, которая является, *** 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 businesslibrary указан как подчиненная библиотека. Так, даже если я опускаю вызов, чтобы загрузить businesslibrary и просто записать,
static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}
затем во-первых businesslibrary загружается (замеченный посредством входа создания глобальной переменной), и затем wrapperlibrary загружается. Управление возвращается назад к клиенту 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 () никогда не печатается.
Каковы могли быть возможные причины для проблемы и в этих подходах и в как я должен продолжить двигаться?
Возможно, сама Java скомпонована с другим glibc, чем ваши библиотеки, или библиотеки по-разному скомпонованы / с разными glibc.
Также проверьте, не связывается ли одна из библиотек с отладочной версией glibc (эта проблема возникает в Windows с библиотекой времени выполнения C ++).
Попробуйте связать свои библиотеки статически с glibc или для исключения возможности статического связывания вашей оболочки и бизнес-библиотек в одну библиотеку.