假设我有一个用于将数据存入 std vector 的函数:
void getData(std::vector<int> &toBeFilled) {
// Push data into "toBeFilled"
}
现在我想将这些数据发送到另一个函数,该函数完成后应释放数据:
void useData(int* data)
{
// Do something with the data...
delete[] data;
}
getData和useData这两个函数是固定的,无法更改。当只复制数据一次时,这种方法可以很好地工作:
{
std::vector<int> data;
getData(data);
int *heapData = new int[data.size()];
memcpy(heapData, data.data(), data.size()*sizeof(int));
useData(heapData);
data.clear();
}
然而,这个memcpy操作代价高昂且并非必需,因为数据已经在堆上。直接提取并使用std vector分配的数据是否可行?类似以下伪代码:
{
std::vector<int> data;
getData(data);
useData(data.data());
data.clearNoDelete();
}
编辑:
这个例子可能没有太多的意义,因为可以在调用useData函数后直接释放向量。然而,在真正的代码中,useData不是一个函数,而是一个接收数据的类,并且这个类的生命周期比向量更长...
std::string
一样,对于一个具有合理小对象静态缓冲区的小项计数向量来说,如果该页面被认为太小,则不会听到完全动态的声音。这样的实现将在您寻求的使用前提下严重崩溃。 - WhozCraig