I know I can do new char[n]
to create an array of n
chars. This works even when n
is not a compile time constant.
But lets say I wanted a size variable followed by n chars:
My first attempt at this is the following:
struct Test
{
std::size_t size;
char a[];
};
However it seems new Test[n]
doesn't do what I expect, and instead allocates n
size
s.
I've also found that sizeof(std::string)
is 4 at ideone, so it seems it can allocate both the size and the char array in one block.
Is there a way I can achieve what I described (presumably what std::string
already does)?
You can use
placement new
:If I understand correctly, you want a class that stores a single pointer to a dynamically allocated length-prefixed string. You can do that by taking advantage of the fact that
char*
can safely alias anything.A simplistic implementation, just to show how it can be done:
While you can do this (and it was often used in C as a workaround of sorts) it's not recommended to do so. However, if that's really what you want to do... here's a way to do it with most compilers (including those that don't play nicely with C99 enhancements).
The C specifications prior to C99 do not allow a zero-length array within a structure. To work around this, an array with a single element is created, and one less than the requested element count is added to the size of the actual structure (the size and the first element) to create the intended size.
Let's keep things short and sweet in C++ using
std::vector
.You can also use the "Length 1 Array" trick. This is in C:
GCC also supports "0 length" arrays for exactly this purpose: http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html