Jam*_*ook 6 c++ memory-management vector
我想使用std :: vector来控制给定的内存.首先,我很确定这不是一个好习惯,但好奇心对我来说更好,我想知道如何做到这一点.
我遇到的问题是这样的方法:
vector<float> getRow(unsigned long rowIndex)
{
float* row = _m->getRow(rowIndex); // row is now a piece of memory (of a known size) that I control
vector<float> returnValue(row, row+_m->cols()); // construct a new vec from this data
delete [] row; // delete the original memory
return returnValue; // return the new vector
}
Run Code Online (Sandbox Code Playgroud)
_m是一个DLL接口类,它返回一个float数组,调用者负责删除.所以我想将它包装在一个向量中并将其返回给用户....但是这个实现为向量分配新的内存,复制它,然后删除返回的内存,然后返回向量.
我想要做的是直接告诉新的向量它可以完全控制这块内存,所以当它被删除时,内存被清除.
更新:这个的原始动机(从DLL返回的内存)被一些响应者相当牢固地压扁了:)但是,我还是想知道这个问题的答案...有没有办法构建一个std :: vector使用给定的一块预先分配的内存T*数组,以及这个内存的大小?
显而易见的答案是使用自定义分配器,但是您可能会发现这确实是您需要的重量级解决方案.如果你想这样做,最简单的方法是通过实现定义分配器(作为vector <>的默认scond模板参数),复制它并使其按要求工作.
另一个解决方案可能是定义vector的模板特化,定义尽可能多的接口,并实现内存定制.
最后,如何使用符合标准的STL接口定义自己的容器,定义随机访问迭代器等.这可能非常容易,因为底层数组将很好地映射到vector <>,并且指向它的指针将映射到迭代器.
评论UPDATE:"有没有办法使用给定的一块预先分配的内存T*数组构建一个std :: vector,以及这个内存的大小?"
当然,这里简单的答案是"不".如果您希望结果是vector <>,那么它必须支持按需增长,例如通过reserve()方法,并且对于给定的固定分配是不可能的.所以真正的问题是:你究竟想要实现什么?可以像vector <>一样使用的东西,或者在某种意义上确实需要的东西是一个向量,如果是这样,那是什么意思呢?
Vector 的默认分配器不提供对其内部的这种类型的访问。您可以使用自己的分配器(向量的第二个模板参数)来完成此操作,但这会改变向量的类型。
如果你可以直接写入向量会容易得多:
vector<float> getRow(unsigned long rowIndex) {
vector<float> row (_m->cols());
_m->getRow(rowIndex, &row[0]); // writes _m->cols() values into &row[0]
return row;
}
Run Code Online (Sandbox Code Playgroud)
请注意,&row[0] 是一个 float*,并且保证向量连续存储项目。