13.4.4 String outs
When a String_var
is passed as an out
parameter, any previous value it refers to must be implicitly
freed. To give C++ mapping implementations enough hooks to meet
this requirement, the string type also results in the generation of
a String_out
type in the CORBA namespace that is used
solely as the string out
parameter type. The general
form for the String_out
type is as follows:
// C++
class String_out
{
public:
String_out(char*& p) : ptr_(p) { ptr_ = 0; }
String_out(String_var& p) : ptr_(p.ptr_) {
string_free(ptr_); ptr_ = 0;
}
String_out(String_out& s) : ptr_(s.ptr_) {}
String_out& operator=(String_out& s) {
ptr_ = s.ptr_; return *this;
}
String_out& operator=(char* p) {
ptr_ = p; return *this;
}
String_out& operator=(const char* p) {
ptr_ = string_dup(p); return *this;
}
operator char*&() { return ptr_; }
char*& ptr() { return ptr_; }
private:
char*& ptr_;
// assignment from String_var disallowed
void operator=(const String_var&);
};
The first constructor binds the reference data member with the char*
&argument. The second constructor binds the reference data member with the char*
held by the String_var
argument, and then calls string_free()
on the string. The third constructor, the copy constructor, binds the reference data member to the same char*
bound to the data member of its argument.
Assignment from another String_out
copies the char*
referenced by the argument String_out
to the char*
referenced by the data member. The overloaded assignment operator for char*
simply assigns the char*
argument to the data member. The overloaded assignment operator for constchar*
duplicates the argument and assigns the result to the data member. The assignment does not cause any previously held string to be freed; in this regard, the String_out
type behaves exactly as a char*
. The char*
&conversion operator returns the data member. The ptr()
member function, which can be used to avoid having to rely on implicit conversion, also returns the data member.
Assignment from String_var
to a
String_out
is disallowed because of the memory
management ambiguities involved. Specifically, it is not possible
to determine whether the string owned by the
String_var
must be taken over by the
String_out
without copying, or if it must be copied.
Disallowing assignment from String_var
forces the
application developer to make the choice explicitly, as
follows:
// C++
void
A::op(String_out arg)
{
String_var s = string_dup("some string");
...
out = s; // disallowed; either
out = string_dup(s); // 1: copy, or
out = s._retn(); // 2: adopt
}
On the line marked with the comment “1,” the caller
is explicitly copying the string held by the
String_var
and assigning the result to the
out
argument. Alternatively, the caller could use the
technique shown on the line marked with the comment “2”
to force the String_var
to give up its ownership of
the string it holds so that it may be returned in the
out
argument without incurring memory management
errors.
Parent topic: Using out Classes