Прежде чем я начну писать свои собственные методы push и pop, я просто хочу убедиться, что я не пропускаю ничего очевидного.
Я подозреваю, что вам не хватает, что soap_malloc()
выделяет память , которая автоматически освобождается по крайней мере при некоторых обстоятельствах.Таким образом, использование realloc()
для изменения размера выделенной памяти вызывает проблемы.Существует реальная вероятность того, что перераспределение как таковое будет успешным, но вы, вероятно, как минимум, получите неприятный беспорядок, когда автоматическое освобождение gSOAP попытается вмешаться в soap_end()
.
С другой стороны,Я не думаю, что вы пропускаете какую-либо функцию перераспределения. Документы действительно, похоже, не описывают ничего.Вы всегда можете реализовать свою собственную оболочку перераспределения, которая выделяет свежую память с помощью soap_malloc()
, копирует содержимое исходного пространства (размер которого вам нужно каким-либо образом узнать) и освобождает исходное пространство с помощью soap_dealloc()
.
Суть в том, что soap_malloc()
не предназначен для использования в качестве распределителя общего назначения, и он не особенно подходит для вашего варианта использования.Его основная задача, по-видимому, внутренняя, чтобы избавить пользователей библиотеки от необходимости вручную освобождать временные объекты, которые выделяет библиотека.Я полагаю, что это удобно для пользователей библиотеки для их непосредственного использования.
Если вы хотите иметь возможность перераспределять блоки, то я предлагаю вам сначала получить их с помощью обычного malloc()
.Вам нужно внимательно прочитать документы, если вы собираетесь смешивать malloc()
отредактированные данные с soap_malloc()
отредактированными данными, но это, вероятно, возможно.В качестве альтернативы рассмотрите подходы, которые не требуют перераспределения, например, хранение данных в связанном списке вместо динамического массива.