Управление памятью с выходными параметрами CORBA/TAO

Допустим, у меня есть функция IDL:

void foo(out Data d);

Когда я наследую сгенерированный код, подпись будет выглядеть примерно так:

void foo(IDL::Data_out d);

Мой первый вопрос: что мне нужно передать на стороне клиента? Я попытался:

IDL::Data_out d;
_servantRef->foo(d);

но это не работает, потому что Data_out не имеет конструктора по умолчанию. Затем я попытался:

IDL::Data* d;
_servantRef->foo(d);

но теперь компилятор не может выполнить преобразование из IDL::Data* в IDL::Data_out. Следующее работает, но выглядит слишком сложным и, следовательно, неправильным:

IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);

Как я должен исходить оттуда? Во время выполнения foo() сервант в какой-то момент выделит объект данных следующим образом:

void Servant::foo(IDL::Data_out d)
{
  d = new Data();
}

Затем я удалю объект после использования его на стороне клиента следующим образом:

IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);
delete d;

Это хотя бы правильно по задумке или это по другому работает? Был бы признателен за небольшую помощь или указатели на документацию, где это описано понятным образом.


person user1709708    schedule 26.06.2014    source источник


Ответы (2)


Вы должны правильно использовать классы _var, они похожи на auto_ptr и убедиться, что память освобождается, когда _var выходит за пределы области видимости. Код клиента должен быть

IDL::Data_var d;
_servantRef->foo (d.out ());

Код серванта должен быть

void Servant::foo(IDL::Data_out d)
{
  d = new Data();
}

Новое сопоставление языка IDL с C++11 упрощает этот путь, так как клиентский код

IDL::Data d;
_servantRef->foo (d);

Код слуги

void Servant::foo(IDL::Data& d)
{
  // modify d
}

См. TAOX11 для получения дополнительной информации о IDL для C++11.

person Johnny Willemsen    schedule 26.06.2014

Ответ Джонни Виллемсена хорош. Но вы также спросили:

Был бы признателен за небольшую помощь или указатели на документацию, где это описано понятным образом.

См. книгу Advanced CORBA Programming with C++ Henning & Vinoski.

Вы также можете загрузить копию официального документа по сопоставлению языков IDL и C++ здесь. Сопоставление IDL с языком C++11 доступно здесь.

person Brian Neal    schedule 27.06.2014