我有一种情况,我需要在运行时确定一定量的内存传递给一个函数.我在堆栈上使用更大的缓冲区,然后只在堆上创建必要的空间:
Foo largeBuf[1024];
int sizeUsed = fillBuff(largeBuf, 1024);
Foo* smallerBuf = new Foo[sizeUsed];
for (UINT i = 0; i < sizeUsed; i++)
{
smallerBuf[i] = largeBuf[i];
}
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?一些标准的阵列复制功能?
您可能应该使用an std::vector,您可以直接从较大缓冲区的元素初始化:
std::vector<Foo> smallerBuf(largeBuf, largeBuf+sizeUsed);
Run Code Online (Sandbox Code Playgroud)
首先,你应该使用std::vector.没有理由不使用它.然后使用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));
Run Code Online (Sandbox Code Playgroud)
或者只是切入最后的追逐:
std::vector<Foo> smallerBuf(largeBuf, largeBuf + sizeUsed);
Run Code Online (Sandbox Code Playgroud)
或另一种方法:
std::vector<Foo> buf(1024); // this replaces your stack array
buf.resize(fillBuff(&buf[0], 1024)); // copies directly into it, resizes
Run Code Online (Sandbox Code Playgroud)
注意在最后一种方法之后,内存仍将被使用.您可以使用copy-swap技巧强制缩小容量:
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);
Run Code Online (Sandbox Code Playgroud)
最理想的是,fillBuf有一种方法(或另一种函数)只返回给定缓冲区时它将返回的元素数.然后你可以这样做:
std::vector<Foo> buf(buffSize()); // or whatever
fillBuff(&buf[0], buf.size());
Run Code Online (Sandbox Code Playgroud)