c++ - 当 vector 超出范围时防止数据被释放

标签 c++ matlab scope stdvector

有没有办法将 std::vector 中包含的数据(由 T*data 指向)的所有权转移到另一个构造中,从而防止在 vector 超出范围后“数据”成为悬空指针?

编辑:我不想复制数据(这是一个简单但无效的解决方案)。

具体来说,我想要这样的东西:

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 的容量、大小等的数据结构......当然不是数据本身)。

能不漏吗?

最佳答案

一个简单的解决方法是将 vector 与您拥有的 vector 交换:

vector<double> myown;

vector<double> someoneelses = foo();

std::swap( myown, someoneelses );

一种更严格但可能更好的方法是为 vector 编写您自己的分配器,并让它从您维护的池中分配。没有个人经验,但也不是太复杂。

关于c++ - 当 vector 超出范围时防止数据被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1727240/

相关文章:

c - 堆栈和引用传递

javascript - 将 Angular 范围变量传递给javascript

c++ - 在 C++ 中传递对数组的引用

c++ - 使用 Vectors 的 Mergesort 排序不正确

c++ - 通过 UDP 接收来自 N 个客户端的响应以回复广播请求

c++ - 为什么不能在派生类初始化时编译代码?

matlab - 使用 Matlab Google-Earth Toolbox 绘制纬度和经度

Matlab - 三角函数的乘积简化

arrays - MatLab 瓶颈

python 变量在赋值前引用 int 与数组