简体   繁体   中英

Memory management with CORBA/TAO out parameters

Lets say I have an IDL function:

void foo(out Data d);

When I inherit from the generated code the signature will look sth like this:

void foo(IDL::Data_out d);

My first question is, what do I have to pass on the client side? I tried:

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

but this doesn't work because Data_out doesn't have a default constructor. I then tried:

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

but now the compiler can't cast from IDL::Data* to IDL::Data_out. The following works but looks overcomplicated and thus not correct:

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

How do I have to proceed from there? During its execution of foo() the servant will at some point allocate a data object like this:

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

I will then delete the object after having used it on the client side like this:

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

Is this at least correct by its idea or does this work differently? Would appreciate a little help or pointers to documentation where this is described in a understandable way.

You have to use the _var classes correctly, they are like an auto_ptr and make sure the memory is freed when the _var goes out of scope. The client code should be

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

The servant code should be

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

The new IDL to C++11 language mapping makes this way easier, there the client code is

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

The servant code is

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

See TAOX11 for more details about IDL to C++11.

Johnny Willemsen's answer is good. But you also asked:

Would appreciate a little help or pointers to documentation where this is described in a understandable way.

See the book Advanced CORBA Programming with C++ by Henning & Vinoski.

You can also download a copy of the official IDL to C++ language mapping document here . The IDL to C++11 language mapping is available here .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM