Mi piacerebbe usare un vettore std :: per controllare un dato pezzo di memoria. Prima di tutto sono abbastanza sicuro che questa non è una buona pratica, ma la curiosità ha la meglio su di me e mi piacerebbe sapere come farlo comunque.costrutto vettoriale C++ con memoria data
Il problema che ho è un metodo come questo:
vector<float> getRow(unsigned long rowIndex)
{
float* row = _m->getRow(rowIndex); // row is now a piece of memory (of a known size) that I control
vector<float> returnValue(row, row+_m->cols()); // construct a new vec from this data
delete [] row; // delete the original memory
return returnValue; // return the new vector
}
_m è una classe di interfaccia DLL che restituisce un array di float che è la responsabilità chiamanti da eliminare. Quindi mi piacerebbe racchiudere tutto ciò in un vettore e restituirlo all'utente .... ma questa implementazione alloca nuova memoria per il vettore, la copia, quindi elimina la memoria restituita, quindi restituisce il vettore.
Quello che mi piacerebbe fare è dire al nuovo vettore che ha il pieno controllo su questo blocco di memoria in modo che quando viene cancellato quella memoria viene ripulita.
UPDATE: La motivazione originale per questo (la memoria restituito da una DLL) è stato abbastanza saldamente schiacciato da un certo numero di responder :) Tuttavia, mi piacerebbe conoscere la risposta alla domanda è comunque ... esiste un modo per costruire un vettore std :: utilizzando un determinato blocco di memoria T * pre-allocata e la dimensione di questa memoria?
Il codice pubblicato causa un comportamento non definito quando si chiama 'delete row' se la memoria è stata allocata con' new [] 'o' malloc' –
Non penso che si possa semplicemente dare un 'vector' a un pezzo di memoria perché 'vector' deve essere in grado di allocare e deallocare a piacimento quando cambia la capacità del' vector'. In questa situazione, ciò richiede la conoscenza di come la DLL alloca/rilascia la memoria, che ovviamente non dovrebbe essere richiesta per lavorare con un'interfaccia DLL appropriata. –
@ChrisDodd, errore di battitura è corretto. @Insilico Non mi dispiace se rilascia e rialloca questo ricordo ... Voglio solo poter dire "Inizia a usare questo pezzo di memoria" –