[omniORB] Allocation of memory for sequence "vars"

Michael Gmelin omniorb at bindone.de
Tue Sep 21 20:24:31 BST 2004


Clarke Brunt wrote:

>From: "Green, Wallace J" <wallace.j.green at boeing.com>
>
>  
>
>>I have a very simple sequence that I am allocating and would like to
>>check that the allocation was successful.
>>
>>The IDL is :
>>
>>   interface SEQ {
>>
>>       enum ABC { want, more };
>>       typedef sequence<ABC> ABCseq;
>>   };
>>
>>And the code (C++) I wish to convert is:
>>
>>  SEQ::ABCseq_var me = new SEQ::ABCseq();
>>   if(me == NULL) printf("ERROR\n");
>>
>>When I compile this, using OMNI, I get an error on the "me == NULL" test
>>to the effect that no such comparison is available.
>>
>>So, under OMNI, what is the appropraite way to verify that the
>>allocation via the "new" was successful?
>>    
>>
>
>I'm never sure how this is intended to be handled either. I've sometimes
>wanted to use a _var type, and to be able to check whether it currently does
>or doesn't contain anything.
>
>Obviously, you can check the allocation before assigning to the _var
>
>SEQ::ABSseq *pme = new SEQ::ABCseq;
>if (pme == NULL) error...
>SEQ::ABCseq_var me = pme;
>
>but that doesn't seem very tidy.
>
>Or you can get at the contained pointer using operator->(), i.e.
>if (pme.operator->() == NULL) error...
>
>but the spec. seems to say that you aren't strictly allowed to call
>operator-> before assigning a valid pointer. Then again, perhaps NULL _is_ a
>valid pointer, albeit to nowhere. Indeed I might consider assigning a NULL
>to the _var to 'empty it out'. The _var also probably has a conversion
>operator to 'const ABCseq&' for use as an 'in' arg. Its in() method will
>produce the same thing. So you could have something equally horrid-looking
>like
>
>if (&me.in() == NULL) error...
>
>And, remember that although you might succeed in allocating the sequence, it
>still has a length of zero (with the default constructor). If you want to
>check every memory allocation, you're going to have to worry about what
>happens when you e.g. call length(n) on it.
>
>So, what does anyone else think? What _are_ you supposed to do?
>
>Clarke Brunt, Pincipal Software Engineer, Yeoman Navigation
>
>
>_______________________________________________
>omniORB-list mailing list
>omniORB-list at omniorb-support.com
>http://www.omniorb-support.com/mailman/listinfo/omniorb-list
>  
>

Use CORBA::is_nil().
SEQ::ABCseq_var me = new SEQ::ABCseq;
if (CORBA::is_nil(me)) throw 0;

gtx
 m





More information about the omniORB-list mailing list