假设我有一个将数据放入 std 向量的函数:
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向量分配的数据?类似于(伪代码):
{
std::vector<int> data;
getData(data);
useData(data.data());
data.clearNoDelete();
}
Edit:
该示例可能没有多大意义,因为可以在对 useData 的函数调用之后释放向量。然而,在真正的代码中,useData不是一个函数,而是一个接收数据的类,并且这个类比向量寿命更长......
No.
您正在使用的 API 有一个合同,规定它拥有您提供的数据的所有权,并且该数据是通过指针提供的。这基本上排除了使用标准向量。
Vector 始终会释放它分配的内存并安全地销毁它包含的元素。这是其保证合同的一部分,您无法将其关闭。
You have如果您希望拥有数据的所有权,请制作数据的副本...或者move每个元素都放入您自己的容器中。或者从你自己的开始new[]
首先(呃)虽然你至少可以将所有这些包装在一些模仿的类中std::vector
并成为非拥有者。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)