2012-12-10 9 views
5

Jeśli mam kodu, które normalnie funkcjonować tak:Przepuścić shared_ptr do OpenGL?

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

Jak mogę osiągnąć ten sam wynik z C++ 11 inteligentny wskaznik? Kto wie, co może się stać, zanim będę miał szansę usunąć tę pamięć.

Sądzę, że muszę sprowadzić do wskaźnika w stylu C?

+0

przy okazji inteligentne wskaźniki nie są C++ 11 wyłącznym ... – user1797612

+0

To nie jest odpowiedź na pytanie, ale chciałbym po prostu użyć '' jako wektor w [ten przykład] (https: //github.com/progschj/OpenGL-Examples/blob/master/01shader_vbo1.cpp#L49). –

Odpowiedz

5

Jeśli Twój kod rzeczywiście wygląda tak, jak w Twoim fragmencie, shared_ptr jest trochę przesadzony, ponieważ wygląda na to, że nie potrzebujesz współdzielonej własności przydzielonej pamięci. unique_ptr ma częściową specjalizację dla tablic, która idealnie pasuje do takich przypadków użycia. Będzie wywoływać delete[] na zarządzanym wskaźniku, gdy wykracza poza zakres.

{ 
    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 ma metodę get, której można użyć do uzyskania wskaźnika w stylu C do zmiennej. Jeśli wskaźnik ten jest ustawiony na std::string, musisz dodatkowo wywołać funkcję c_str(), aby uzyskać wskaźnik do łańcucha w stylu C.

edytuj: Zauważam, że funkcja zapisuje ciąg znaków w przeciwieństwie do czytania. Będziesz musiał najpierw zmienić rozmiar std :: string, a nawet później, the pointer returned by c_str isnt meant for writing. std :: shared_ptr powinien działać.

+0

Do pisania możesz użyć & str [0]. W C++ 11 jest gotowy do pracy (standard wymaga pamięci przydzielonej z konieczności) – milleniumbug