¿Hay alguna manera de transferir la propiedad de los datos contenidos en un std :: vector (apuntado por, digamos T * data) a otro constructo, evitando tener "datos" convertirse en un puntero colgando después de que el vector sale del alcance?evitando que se liberen datos cuando el vector sale del alcance
EDITAR: NO QUIERO COPIAR LOS DATOS (lo cual sería una solución fácil pero ineficaz).
En concreto, me gustaría tener algo como:
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
}
La única cosa que viene a la mente para emular esto es:
{
vector<double>*v=new vector<double>();
//grow *v...
data=(*v)[0];
}
y luego posteriormente ser liberados ya sea de datos o (en mi caso) utilizado como mxSetData (mxArray A, datos dobles). Sin embargo, esto da como resultado una pequeña pérdida de memoria (estructura de datos para manejar la capacidad, el tamaño, etc. de v), pero no los datos en sí mismos, por supuesto).
¿Es posible sin fugas?
Eso es bastante confuso. Además, intente preguntar en un foro de C++. – Nzbuu
mxSetData y mxArray son parte de la interfaz C de matlab (a través de archivos C mex). – spirov
Sí, pero en realidad no es una pregunta de Matlab *: las personas que saben que Matlab vendrá para ayudarlo no podrán contribuir con nada a menos que conozcan C++. – quark