Присвоить значение указателю std::string, созданному с помощью soap_malloc

В настоящее время я реализую веб-сервис с использованием gsoap версии 2.8 и сталкиваюсь с ошибками сегментации.

Поэтому я выделяю память с помощью 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 того, как скопировать строку в С++, не дал мне подсказки, как решить проблему с помощью указателей std::string


person Del Pedro    schedule 24.06.2013    source источник
comment
Я не знаю gSoap, но мне приходит в голову, что вы назначаете std::string (в фиксированном распределении памяти), а затем вставляете/добавляете во внутреннюю память строки. Когда вы создаете новую строку, вы полностью контролируете объект, и он работает (но дает утечки) - не могли бы вы поэкспериментировать с массивами символов фиксированного размера и посмотреть, работает ли тогда soap_malloc? (т.е. скопировать в массив)   -  person Caribou    schedule 24.06.2013
comment
Массив символов фиксированного размера не работал, потому что мне нужно было создать их с помощью {}, char * работал.   -  person Del Pedro    schedule 24.06.2013
comment
хорошо - я думаю, возможно, что ошибка seg связана с тем, что строка перераспределяет память внутри. Надеюсь, это продвинет вас немного дальше. Извините, я не могу больше помочь.   -  person Caribou    schedule 24.06.2013


Ответы (3)


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

person Del Pedro    schedule 26.06.2013

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

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

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

person user3794048    schedule 28.10.2014
comment
В моем случае было запрещено менять xsd! - person Del Pedro; 28.10.2014

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

См. документацию по gsoap, глава 9.13.1 Политики выделения памяти и управления.

person Bartosz Rosa    schedule 13.04.2017