【发布时间】:2009-11-13 05:08:16
【问题描述】:
有没有办法将 std::vector 中包含的数据的所有权(由 T*data 指向)转移到另一个构造中,防止在向量超出范围后“数据”成为悬空指针?
编辑:我不想复制数据(这将是一个简单但无效的解决方案)。
具体来说,我想要类似的东西:
template<typename T>
T* transfer_ownership(vector<T>&v){
T*data=&v[0];
v.clear();
...//<--I'd like to make v's capacity 0 without freeing data
}
int main(){
T*data=NULL;
{
vector<double>v;
...//grow v dynamically
data=transfer_ownership<double>(v);
}
...//do something useful with data (user responsible for freeing it later)
// for example mxSetData(mxArray*A,double*data) from matlab's C interface
}
我想到的唯一可以效仿的是:
{
vector<double>*v=new vector<double>();
//grow *v...
data=(*v)[0];
}
然后数据稍后将被释放或(在我的情况下)用作 mxSetData(mxArrayA,doubledata)。然而,这会导致少量内存泄漏(用于处理 v 的容量、大小等的数据结构......当然不是数据本身)。
能不漏吗?
【问题讨论】:
-
这很令人困惑。另外,请尝试在 C++ 论坛中提问。
-
mxSetData 和 mxArray 是 matlab C 接口的一部分(通过 C mex 文件)。
-
是的,但这不是一个真正的 Matlab 问题 -- 知道 Matlab 的人来这里帮助你将无法贡献任何东西,除非他们知道 C++。跨度>
-
@spirov,我建议稍微澄清一下你的问题,因为虽然答案正在回答你的问题,但他们似乎不清楚你问的原因。据我所知,您想知道两件不同的事情(1)如何在函数退出后保持向量中的内存(即如何将其从堆栈中存储)和(2)如何传递不复制的向量到外部 API。我认为你的问题中第一个很清楚,但第二个不是。
-
是的,我想要(1)虽然不一定将它存储在堆栈中(外部 API 接受动态创建的内存),以及(2)(但这部分很简单,我只给出 &v[ 0]).
标签: c++ matlab scope stdvector