2013-06-24 1 views
1

В настоящее время я реализую webservice с использованием gsoap версии 2.8 и работает с ошибками сегментации.Назначить значение std :: string pointer, созданный с помощью soap_malloc

Therefor выделяю память с помощью soap_malloc так:

OSoap *myObject = (OSoap *)soap_new_OSoap(this); 
myObject->myString = (std::string*)soap_malloc(this, sizeof(std::string)); 

Исходный код OSoap генерируется с использованием WSDL и выглядит следующим образом:

class SOAP_CMAC OSoap { 
... 
public: 
    std::string *myString; // optional attribute 
... 
} 

Теперь я строка выделена, но как я пишу содержимое этой строки?

myObject->myString->insert(0, "123"); 

и

*(myObject->myString) += "abc"; 

приводят к сегментации ошибок.

std::string *abc = new std::string("abc"); 
myObject->myString = abc; 

работает, но производит утечку памяти, которую я стараюсь избегать.

Поиск Google или StackOverflow для того, как скопировать строку в C++ не дала мне подсказку, как решить эту проблему с помощью станда :: Струнных указателей

+0

Я не знаю gSoap, но мне приходит в голову, что вы назначаете std :: string (в фиксированном распределении памяти), а затем вставляете/добавляете во внутреннюю память строки. Когда вы вводите новую строку, вы полностью контролируете объект, и он работает (но течет) - может экспериментировать с массивами char с фиксированным размером и посмотреть, будет ли тогда soap_malloc? (Копия I.E. в массив) – Caribou

+0

фиксированный массив символов не работал, потому что мне нужно было бы инициировать их с помощью {}, char *. –

+0

ok - Я думаю, что возможно, что ошибка seg вызвана перераспределением внутренней памяти. Надеюсь, это поможет вам немного дальше. Извините, я не могу больше помочь. – Caribou

ответ

3

Ok - при использовании зОго :: строка * следует использовать soap_instantiate_std__string вместо soap_malloc, которого я не нашел в документации, тогда все работает нормально!

2

У меня была та же проблема. Я видел, что ваш std :: string * является «необязательным» атрибутом. После того как я написал:

<xsd:element minOccurs="1" maxOccurs="1" name="myString" type="xsd:string"/> 

он изменился к станд :: строка в заголовке! Я не знаю, используете ли вы элемент xsd, но это способ, который работает хорошо.

+0

В моем случае было запрещено изменять xsd! –

0

Сложные типы могут быть созданы с использованием soap_new_XXX функций, таких как soap_new_std__string(soap, 1) в этом случае. Эта функция вызывает внутренне soap_instantiate_std__string. Память будет автоматически выпущена gsoap.

См. gsoap documentation глава 9.13.1 Правила распределения и управления памятью.