Firstly, you should be using std::vector
. There's no reason not to use it. Then use std::copy
:
// surely the pointer was an accident
Foo largeBuf[1024];
// int? design should be changed to use an unsigned type
int sizeUsed = fillBuff(largeBuf, 1024);
// vector, no memory leaks
std::vector<Foo> smallerBuf;
smallerBuf.reserve(sizeUsed);
// copy
std::copy(largeBuf, largeBuf + sizeUsed, std::back_inserter(smallerBuf));
Or just cut to the chase at the end with:
std::vector<Foo> smallerBuf(largeBuf, largeBuf + sizeUsed);
Or another approach:
std::vector<Foo> buf(1024); // this replaces your stack array
buf.resize(fillBuff(&buf[0], 1024)); // copies directly into it, resizes
Note after this last approach, the memory will still be in use. You can force the capacity to shrink with the copy-swap trick:
template <typename T, typename A>
void shrink_to_fit(std::vector<T, A>& pVector)
{
std::vector<T, A>(pVector).swap(pVector);
}
// ...
shrink_to_fit(buf);
Most ideal, fillBuf
would have a way (or another function) to just return the number of elements it will return given a buffer. Then you can just do:
std::vector<Foo> buf(buffSize()); // or whatever
fillBuff(&buf[0], buf.size());