2012-12-10 3 views
5

나는 일반적으로 다음과 같은 기능을 할 코드가있는 경우 :shared_ptr을 OpenGL에 전달 하시겠습니까?

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

가 어떻게이 C++ (11) 스마트 포인터와 같은 결과를 얻을 수 있습니까? 그 기억을 지울 기회가 생기기 전에 어떤 일이 일어날 지 누가 알겠습니까?

그래서 C 스타일 포인터를 사용하지 않아도 될까요?

+0

스마트 포인터는 C++ (11) 배타적이지 ... – user1797612

+0

이 답변으로 문제가 해결되지 않습니다,하지만 난 단지와 같이'벡터 을'사용한다 [예] (HTTPS : //github.com/progschj/OpenGL-Examples/blob/master/01shader_vbo1.cpp#L49). –

답변

5

코드가 실제로 스 니펫에있는 것처럼 보이는 경우 shared_ptr은 할당 된 메모리의 공유 소유권이 필요하지 않은 것처럼 보이기 때문에 상황에 대한 약간의 과도한 사용입니다. unique_ptr에는 그러한 사용 사례에 가장 적합한 배열의 부분 전문화가 있습니다. 범위를 벗어나면 관리되는 포인터에 delete[]이 호출됩니다. 그런데

{ 
    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에는 변수에 대한 C 스타일 포인터를 얻는 데 사용할 수있는 get 메서드가 있습니다. 해당 포인터가 std::string 인 경우 c_str() 함수를 호출하여 C 스타일 문자열에 대한 포인터를 가져와야합니다.

편집 :이 기능은 읽기와 달리 문자열에 쓰고 있음을 알 수 있습니다. std :: string의 크기를 먼저 조절해야하며, 그 후에도 the pointer returned by c_str isnt meant for writing을 조정해야합니다. std :: shared_ptr 그래도 작동합니다.

+0

쓰려면 & str [0]을 사용할 수 있습니다. C++ 11에서는 작동을 과시했습니다 (표준은 대등하게 할당 된 저장소가 필요합니다) – milleniumbug

관련 문제