2012-12-10 12 views
5

Wenn ich Code habe, wie dies in der Regel funktionieren würde:Übergeben Sie eine shared_ptr an OpenGL?

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

Wie kann ich das gleiche Ergebnis mit einem C++ 11 Smart Pointer erreichen? Wer weiß, was passieren könnte, bevor ich diese Erinnerung löschen kann.

Also ich denke, ich muss zu einem C-Stil-Zeiger zu reduzieren?

+0

durch die Art, wie die Smart-Pointer sind kein C++ 11 exklusive ... – user1797612

+0

diese Antwort Ihre Frage nicht, aber ich würde einfach einen 'Vektor ' wie in [dieses Beispiel] verwenden (https: //github.com/progschj/OpenGL-Examples/blob/master/01shader_vbo1.cpp#L49). –

Antwort

5

Wenn Ihr Code wirklich so aussieht wie in Ihrem Snippet, ist shared_ptr ein bisschen ein Overkill für die Situation, weil es so aussieht, als ob Sie keinen gemeinsamen Besitz des zugewiesenen Speichers benötigen. unique_ptr hat eine teilweise Spezialisierung für Arrays, die für solche Anwendungsfälle perfekt geeignet ist. Es ruft delete[] auf dem verwalteten Zeiger auf, wenn es den Gültigkeitsbereich verlässt.

{ 
    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 hat eine Methode get, die Sie verwenden können, um einen C-Stil-Zeiger auf die Variable zu erhalten. Wenn dieser Zeiger auf eine std::string verweist, müssen Sie die c_str()-Funktion weiter aufrufen, um einen Zeiger auf C-Stil-Zeichenfolge zu erhalten.

edit: Ich stelle fest, dass die Funktion im Gegensatz zum Lesen in den String schreibt. Sie müssten zuerst die std :: string ändern und danach sogar the pointer returned by c_str isnt meant for writing. std :: shared_ptr sollte jedoch funktionieren.

+0

Zum Schreiben können Sie & str [0] verwenden. In C++ 11 ist es garantiert zu funktionieren (der Standard erfordert den Löschspeicher) – milleniumbug

Verwandte Themen