Ho scritto una funzione che carica i byte da un file e restituisce una struttura FileData che contiene il buffer di byte e la lunghezza del buffer.Utilizzo di puntatori intelligenti in una struct o classe
Desidero cancellare il buffer non appena viene consumato e gettato fuori dall'ambito.
Ho difficoltà a farlo compilare a causa di vari errori di trasmissione. Inoltre, non sono sicuro che il buffer venga spostato correttamente anziché copiato. Non mi interessa che la struttura FileData venga copiata, poiché al massimo è composta da 16 byte.
In generale, come si usano i puntatori intelligenti come campi di classe/struct? È qualcosa che potresti fare?
Questa è una domanda un po 'nebulosa, lo so, ma dal momento che sto avendo alcune difficoltà concettuali con i puntatori intelligenti in generale, spero che questo esempio mi aiuti nella giusta direzione.
Ecco quello che ho finora:
struct FileData
{
unique_ptr<char[]> buf;
unsigned int len;
};
FileData LoadFile(string filename)
{
ifstream str;
str.open(filename, ios::binary);
str.seekg(0, ios::end);
auto len = str.tellg();
str.seekg(0, ios::beg);
char* buf = new char[len];
str.read(buf, len);
str.close();
FileData d = { unique_ptr<char[]>(buf), len };
return d;
}
Edit: Dal momento che alcune persone sono curiosi di sapere il messaggio di errore che ottengo con questo codice corrente, eccolo:
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
Il tuo problema è che non fornisci alcun dettaglio specifico sui messaggi di errore. Come possiamo identificarli altrove? – Puppy
@DeadMG Ho pensato che sarebbe stato chiaro che ci sono problemi con il codice, dal momento che ho fatto notare che non sono sicuro che questo sia il modo corretto di usare puntatori intelligenti e spostare la semantica. Mi piacerebbe che il codice facesse più che compilare; Mi piacerebbe che fosse corretto e idiomatico. Tuttavia, ho aggiornato la domanda con il messaggio di errore. –
L'errore che stai ottenendo è che stavi cercando di copiare un unique_ptr, devi usare std :: move. Potresti aver usato un shared_ptr e dichiarato il tuo deallocator, ma la soluzione vettoriale è molto più pulita. – pstrjds