Есть ли способ передать право собственности на данные, содержащиеся в std :: vector (с указанием, например, данными T *), в другую конструкцию, предотвращая «данные», стать свисающим указателем после того, как вектор выходит за рамки?, предотвращающий освобождение данных, когда вектор выходит за пределы области видимости
EDIT: Я НЕ ХОЧУ КОПИРОВАТЬ ДАННЫЕ (что было бы простым, но неэффективным решением).
В частности, я хотел бы иметь что-то вроде:
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 (mxArray A, double данных). Однако это приводит к небольшой утечке памяти (структура данных для обработки емкости, размера и т. Д., Но не самих данных).
Возможно ли утечка?
Это довольно запутанно. Также попробуйте спросить на форуме C++. – Nzbuu
mxSetData и mxArray являются частью интерфейса Matlab C (через файлы C mex). – spirov
Да, но это не вопрос Matlab * - Люди, знающие, что Matlab придет сюда, чтобы помочь вам, не смогут вносить что-либо, если они не знают C++. – quark