2012-12-10 15 views
5

Se Ho codice che normalmente funziona in questo modo:Passa un shared_ptr a OpenGL?

char* log = new char[logLength]; 
glGetProgramInfoLog(..., ..., log) 
//Print Log 
delete [] log; 

Come potrei ottenere lo stesso risultato con un C++ 11 puntatore intelligente? Chissà cosa potrebbe accadere prima che io abbia la possibilità di cancellare quella memoria.

Quindi suppongo di dover eseguire il downcast su un puntatore in stile C?

+0

dal modo in cui i puntatori intelligenti non sono un C++ 11 Exclusive ... – user1797612

+0

Ciò non rispondere alla tua domanda, ma mi sarebbe sufficiente utilizzare un '' vettore come in [questo esempio] (https: //github.com/progschj/OpenGL-Examples/blob/master/01shader_vbo1.cpp#L49). –

risposta

5

Se il tuo codice sembra davvero quello nel tuo snippet, shared_ptr è un po 'eccessivo per la situazione, perché sembra che non è necessario condividere la proprietà della memoria allocata. unique_ptr ha una specializzazione parziale per gli array che si adattano perfettamente a tali casi d'uso. Chiamerà delete[] sul puntatore gestito quando esce dall'ambito.

{ 
    std::unique_ptr<char[]> log(new char[logLength]); 
    glGetProgramInfoLog(..., ..., log.get()); 
    //Print Log 
} // allocated memory is released since log went out of scope 
3

std::shared_ptr ha un metodo get che è possibile utilizzare per ottenere un puntatore in stile C alla variabile. Se il puntatore si trova su un valore std::string, è necessario chiamare ulteriormente la funzione c_str() per ottenere un puntatore alla stringa di stile C.

modifica: noto che la funzione sta scrivendo sulla stringa anziché sulla lettura. Dovresti ridimensionare prima la stringa: std :: e anche dopo, the pointer returned by c_str isnt meant for writing. std :: shared_ptr dovrebbe funzionare comunque.

+0

Per scrivere puoi usare & str [0]. In C++ 11 è garantito il funzionamento (lo standard richiede memoria allocata) – milleniumbug

Problemi correlati