[omniORB] C++ mapping of IDL struct
Sean Parker
supinlick at yahoo.com
Fri Apr 20 09:55:54 BST 2007
Thanks a ton - I'll try it
Cheers and God Bless
Sean
--- Carlos <carlos at canama.net> wrote:
> El mar, 17-04-2007 a las 07:18 -0700, Sean Parker
> escribió:
> >
> > Hello -
> >
> > I have a question about the "proper" way to return
> > structs from server methods. (I end up with a memory
> leak,
> > but the data gets through fine)
> >
> > For example:
> >
> > <IDL code>
> > struct MyStruct
> > {
> > long a;
> > string b;
> > };
> > interface X
> > {
> > MyStruct doit();
> > }
> > <end IDL code>
> >
> > Then in C++:
> >
> > <C++ code>
> >
> > MyStruct*
> > X_impl::doit()
> > {
> > MyStruct* ms = new MyStruct();
> > ms->a = 0;
> > ms->b = ::CORBA::string_dup( "hello" );
> > return ms;
> > }
> >
> > <end C++ Code>
> >
> >
>
> I think this code is correct, but perhaps the memory leak
> is in client
> side, in order to manage the return in a correct way:
>
> X_var x_var = ....
>
> MyStruct_var s_var = x_var->doit();
>
> Now the return pointer is owned by s_var, so when s_var
> gets out of
> scope the destructor properly frees the memory.
>
> And in server side perhaps a better implementation is:
>
> MyStruct*
> X_impl::doit()
> {
> MyStruct_var s_var = new MyStruct();
> s_var->a = 0;
> s_var->b = ::CORBA::string_dup("Hello");
> return s_var._retn();
> }
>
> This implementation is better because if inside the
> method a exception
> is raised the destructor of MyStruct_var is called, so
> you don't get a
> memory leak.
>
> Cheers.
>
> Carlos.
>
> > I suppose there are "preferred" ways to do this, so
> that's
> > what I'm asking, what's the preferred (or only) way to
> do
> > this w/o memory leaks? When using valgrind, I always
> have a
> > leak of both the string 'b' and the MyStruct
> allocation. Is
> > there a alloc_buf function I need to use, as in
> creating
> > sequences of structs? (I thought of always returning
> > sequences of size one, since I do sequences alot
> elsewhere
> > w/o leaks, but that seems klugy...)
> >
> > Any help appreciated -
> > Thanks and God Bless
> >
> > Sean
> >
> > P.S. I'm using oo 4;
> >
> > P.P.S. the C++ mapping doc from OMG suggestes something
> > like a _rtrn() function, as an example for
> implementations
> > to do things, but not sure that omniORB has such a
> thing...
> >
> >
> > __________________________________________________
> > Do You Yahoo!?
> > Tired of spam? Yahoo! Mail has the best spam
> protection around
> > http://mail.yahoo.com
> >
> > _______________________________________________
> > omniORB-list mailing list
> > omniORB-list at omniorb-support.com
> >
>
http://www.omniorb-support.com/mailman/listinfo/omniorb-list
> >
> >
>
>
God Bless
Sean Parker
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
More information about the omniORB-list
mailing list