Есть ли способ перенести владение данными, содержащимися в 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
}
Единственное, что приходит мне на ум, это подражать:
{
vector<double>*v=new vector<double>();
//grow *v...
data=(*v)[0];
}
и затем данные будут либо освобождены, либо (в моем случае) использованы как mxSetData (mxArray A, double data). Однако это приводит к небольшой утечке памяти (структура данных для управления емкостью, размером и т. Д., Но не сами данные, конечно).
Возможно ли это без утечки?