Esiste un modo per trasferire la proprietà dei dati contenuti in un vettore std :: (indicato da, ad esempio T * dati) in un altro costrutto, impedendo di avere "dati" diventare un puntatore penzolante dopo che il vettore è andato fuori portata?impedendo che i dati vengano liberati quando il vettore non rientra nell'ambito di applicazione
MODIFICA: NON VOGLIO COPIARE I DATI (che sarebbe una soluzione facile ma inefficace).
In particolare, mi piacerebbe avere qualcosa di simile:
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
}
L'unica cosa che mi viene in mente per emulare questo è:
{
vector<double>*v=new vector<double>();
//grow *v...
data=(*v)[0];
}
e poi saranno successivamente essere sia liberato i dati o (nel mio caso) usato come mxSetData (mxArray A, doppio dati). Tuttavia questo si traduce in una piccola perdita di memoria (struttura dei dati per la gestione della capacità di V, dimensioni, ecc ... ma non i dati stessi, ovviamente).
E 'possibile senza perdite?
Questo è piuttosto confuso. Inoltre, prova a chiedere in un forum C++. – Nzbuu
mxSetData e mxArray fanno parte dell'interfaccia MATlab C (tramite file C mess). – spirov
Sì, ma non è proprio una domanda Matlab * * - Le persone che conoscono Matlab venire qui per aiutarti non saranno in grado di contribuire a nulla a meno che non conoscano il C++. – quark