当向量超出范围时,防止数据被释放

spi*_*rov 7 c++ matlab scope stdvector

有没有办法将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
}
Run Code Online (Sandbox Code Playgroud)

我想到的唯一可以模仿的是:

{
    vector<double>*v=new vector<double>();
    //grow *v...
    data=(*v)[0];
}
Run Code Online (Sandbox Code Playgroud)

然后,数据将被释放或(在我的情况下)用作mxSetData(mxArray A,双数据).然而,这会导致内存泄漏(用于处理v的容量,大小等的数据结构......但当然不是数据本身).

没有泄漏可能吗?

xto*_*ofl 7

一个简单的解决方法是使用您拥有的向量交换向量:

vector<double> myown;

vector<double> someoneelses = foo();

std::swap( myown, someoneelses );
Run Code Online (Sandbox Code Playgroud)

更难但可能更好的方法是为向量编写自己的分配器,并让它从您维护的池中分配.没有个人经验,但并不太复杂.


Jul*_*n-L 6

使用std :: vector的关键是不必担心其中的数据:

  • 保持你的矢量在你的应用程序;
  • 将const-ref传递给其他函数(以避免不必要的复制);
  • 并且feed函数期望指向T的指针&v[0].

如果你真的不想保留你的矢量,你将不得不复制你的数据 - 你不能转移所有权,因为std::vector它保证在超出范围时会破坏它的内容.在这种情况下,请使用该std::copy()算法.


Mic*_*fik 0

这样的事情对你有用吗?

int main()
{
    double *data = 0;
    {
        vector<double> foo;
        // insert some elements to foo

        data = new double[foo.size()];
        std::copy(foo.begin(), foo.end(), &data[0]);
    }

    // Pass data to Matlab function.
    delete [] data;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)