[omniORB] string_dup() behavior

Lionel Gilet lgilet@san-jose.tt.slb.com
Fri Jul 12 18:22:00 2002

Let me provide a bit more info.
I am using Visual Studio.NET and Windows 2000.

The compiler options are:
/nologo /Od /Z7 /D__WIN32__ /D__x86__ /D__NT__ /D__OSVERSION__=4
The executable is linked with:

The code is pretty much reduced to:
  CORBA::String_var theString = CORBA::string_dup((const char*) "name");

When I reach the end of scope I get:
HEAP: Invalid Address specified to RtlFreeHeap ( 510000, 417d18 )

Again I do not get the problem if I use CORBA::String_var::string_dup() or if I link with the static

I also tried:
  char* newName = new char [10];
  strcpy(newName, "name");
  CORBA::String_var theString = CORBA::string_dup(newName);

and I get the same result.

CORBA::string_dup() does duplicate the string so I really do not understand why the string member can
not be deleted and why the behavior is fine with CORBA::String_var::string_dup();

Thank you for sharing your ideas,

Lionel Gilet

Schlumberger / NPtest

baileyk@schneider.com wrote:

> My guess is the problem is caused by a mix of different runtime libraries
> too.  I don't run omniORB on Windows but I've done enough Windows DLL
> programming to know how easy it is to fall into that trap.
> I don't agree that one needs to cast all string literals.  If you use
> CORBA::string_dup, you don't need to also cast the argument.  If you are
> constructing a String_var directly, then yes.
> CORBA::String_var theString("name"); // not a good idea on all platforms
> CORBA::String_var theString((char const*)"name"); // more reliable
> But I always just use CORBA::string_dup() to make it clear that a copy is
> being made.
> Kendall
>                     "Visscher, Bruce"
>                     <VISSCHB@rjrt.com>         To:     "Lionel Gilet" <lgilet@san-jose.tt.slb.com>,
>                     Sent by:                    "OmniOrb List" <omniorb-list@realvnc.com>
>                     omniorb-list-admin@r       cc:
>                     ealvnc.com                 Fax to:
>                                                Subject:     RE: [omniORB] string_dup() behavior
>                     07/11/2002 08:08 PM
> > {
> >   CORBA::String_var the String = CORBA::string_dup("name");
> > }
> I don't really see why this should be a problem (except for the obvious
> typo in the variable name).
> Are you sure you used consistent compiler options?  If you link against the
> omniORB DLLs you must configure your project to compile
> and link against the multi-threaded DLL version of the MSC run time.
> In any case, you should always cast literal strings to "pointer to const
> char" to be on the safe side.  The C++ standard mandates
> that string literals are of this type already so the cast wouldn't be
> needed with a standards conforming compiler.
> The CORBA C++ mapping made some unfortunate choices regarding pointers to
> non-const char.
> HTH,
> Bruce
> (See attached file: InterScan_Disclaimer.txt)
>   ------------------------------------------------------------------------
>                                Name: InterScan_Disclaimer.txt
>    InterScan_Disclaimer.txt    Type: Plain Text (text/plain)
>                            Encoding: BASE64