Carlos Moreno wrote:
> Hi,
>
> I'm facing a situation where it would seem all possible solutions
> have some severe inconvenience.
>
> I'm creating a C++ wrapper for a C library; in this one function,
> I need to return a string. The underlying C library expects me
> to pass it a pointer where to put the result; that pointer needs
> to be dynamically allocated in the general case.
>
> So, my function goes more or less like this:
>
> string f()
> {
> char * result = new char [ ... ];
>
> int length = call_c_function (result, .... other
> parameters ... );
> // the function places the result string in the memory
> // pointed to by result, and it returns the length of the
> string
>
> return string (result, result + length);
> }
>
> Ok, obvious problem, the memory leak; if I get around that by
> constructing a string object first, then delete[] and then return,
> I'm being less efficient than I could (what I'm doing is part of a
> library, so efficiency *is* a concern, as I don't want to impose
> up-front an inefficiency that *may or may not* be im****tant for
> a particular application that uses the library).
>
> A presumably clean solution is to use a stock smart pointer:
>
> auto_ptr<char> result (new char [ ... ]);
> // ...
> return string (result.get(), result.get() + length);
>
> The "main" question of my post is here: would the above
> constitute undefined behaviour? I'm allocating with new[],
> but auto_ptr's destructor calls delete, and not delete[].
>
Yes, that's UB.
> I recall that the typical advice is: use auto_ptr for single
> objects, and vector for an array of objects --- but I don't
> want vector's constructor to initialize all characters to 0!
> I don't need that array to be initialized, and therefore I
> *do not want* to initialize it (efficiency, of course).
>
Have you benchmarked to see that said initialization is actually causing
a problem? Remember Hoare's/Knuth's Law: "Premature optimization is
the root of all evil".
--
[ See http://www.gotw.ca/resources/clcm.htm
for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]


|