OrmaJever
@OrmaJever

Системные аллокаторы в php extension

Вопрос именно к тем кто писал php extension, а не просто к c++ разработчикам :)
В общем пишу я расширение для php на с++. Раньше я для строк использовал старый добрый char *, но со временем кода становилось больше и ошибок связанных со строками тоже, и вот я решил попробовать перейти на std::string. Переписав всё на std::string php при запросах стал благополучно падать, опытным путём выяснилось что падает он на банальной операции append. Я чесал репу с удивлённым лицом дня 2, я же переходил на плюсовые строки только потому что они безопасны и не падают, и вот минут 10 назад меня осенило! Zend использует свои аллокаторы (emalloc, erealloc, ...) и когда я по привычке писал системные malloc, realloc, и т.д. то php так же падал, и вот сегодня до меня дошло что std::string выделяет память то именно стандартными аллокаторами, а zend этого не воспринимает вот и падает. И как быть в этой ситуации? Получается что все стандартные классы c++ нельзя использовать для php extension? И что мне придётся писать собственную копию std::string? Сталкивался ли кто нибудь с таким?
  • Вопрос задан
  • 2861 просмотр
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Реализуйте шаблонный класс аллокатора через emalloc, erealloc, и дальше используйте его шаблонным параметром std::basic_string и других шаблонов stl принимающих аллокаторы.

Получается что все стандартные классы c++ нельзя использовать для php extension? И что мне придётся писать собственную копию std::string?


Получается, что иногда полезно читать документацию.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
OrmaJever
@OrmaJever Автор вопроса
Я как белый человек использовал и читал доки только по std::string, да и подумать я не мог что класс может принимать сторонние аллокаторы :) jcmvbkbc вы бы не могли подсказать как правильно описать класс аллокатор? Сейчас я сделал так
class Ealloc : public std::allocator< char >
	{
		void *allocate(size_t size, void *ptr = nullptr);
		void destroy( void * );
	};
// ...
class string : public std::basic_string<char, std::char_traits<char>, Ealloc> //...
// ...
void *Data::Ealloc::allocate(size_t size, void *ptr)
{

	return ptr == nullptr ? emalloc(size) : erealloc(ptr, size);
}

void Data::Ealloc::destroy( void *ptr )
{
	efree(ptr);
}


и я так и не понял что делает метод deallocate ? Что значит реализовать не реализованную память?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы