在向量超出范围后,是否可以强制std :: vector不释放其内存?
例如,如果我有
int* foo() {
std::vector<int> v(10,1); // trivial vector
return &v[0];
}
int main()
{
int* bar = foo();
std::cout << bar[5] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
不能保证这些值仍可在此处访问。
我目前正在这样做
int* foo() {
std::vector<int> v(10,1);
int* w = new int[10];
for (int i=0; i<10; i++) {
w[i] = v[i];
}
return w;
}
Run Code Online (Sandbox Code Playgroud)
但是重新填充一个全新的数组有点浪费。有没有办法强制std :: vector不删除其数组?
注意:我不返回向量本身,因为我使用SWIG将c ++与python接口,并且ARG_OUTVIEW_ARRAY需要原始指针,并且实际上是有意的内存泄漏。但是,我仍然希望能够在构造数据本身时利用向量特征。
有可能,但您永远不要这样做。强迫向量离开内存泄漏是一个可怕的主意,如果您需要这样的事情,则需要重新考虑您的设计。std :: vector是一种资源管理类型,其主要目标之一是确保我们不会泄漏。永远不要试图打破那个。
现在,要回答您的特定问题:std::vector将分配器类型作为第二个模板参数,默认为std::allocator<T>。现在,您可以编写一个不释放任何内存的自定义分配器,并将其与向量一起使用。编写自定义分配器并不是一件容易的事,因此在这里我将不进行描述(但是您可以通过Google找到这些教程)。
如果您确实要使用自定义分配器,则必须确保向量永远不会触发增长操作。原因是在容量增加期间,向量会将数据移动/复制到新位置,并使用分配器释放旧内存。如果使用泄漏的分配器,那么在增长过程中,您不仅会保留最终数据,而且还会保留旧的内存,我确定您不想保留这些旧的内存。因此,请确保创建具有完整容量的向量。
这vector是为了防止泄漏而设计的。
但如果你想搬起石头砸自己的脚,那也是有可能的。以下是防止向量释放其内部数组的方法:
int *foo()
{
std::vector<int> v(10,1);
int *ret = v.data();
new (&v) std::vector<int>; // Replace `v` with an empty vector. Old storage is leaked.
return ret;
}
Run Code Online (Sandbox Code Playgroud)
正如其他答案所说,你永远不应该这样做。