Управление памятью с параметрами CORBA/TAO out

#corba #out-parameters #tao

#corba #out-параметры #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() servant в какой-то момент выделит объект данных, подобный этому:

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

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

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

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

Ответ №1:

Вы должны правильно использовать классы _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::Dataamp; d)
{
  // modify d
}
 

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

Ответ №2:

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

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

См. книгу Хеннинга и Виноски «Расширенное программирование CORBA на C «.

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