我想使用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 }
_m是一个DLL接口类,它返回一个float数组,调用者负责删除.所以我想将它包装在一个向量中并将其返回给用户….但是这个实现为向量分配新的内存,复制它,然后删除返回的内存,然后返回向量.
我想要做的是直接告诉新的向量它可以完全控制这块内存,所以当它被删除时,内存被清除.
更新:这个的原始动机(从DLL返回的内存)被一些响应者相当牢固地压扁了:)但是,我还是想知道这个问题的答案…有没有办法构建一个std :: vector使用给定的一块预先分配的内存T *数组,以及这个内存的大小?
解决方法
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; }
请注意,& row [0]是一个浮点*,并且保证向量可以连续存储项目.