Josh Elias
Josh Elias

Reputation: 3290

Pass a shared_ptr to OpenGL?

If I have code that would normally function like this:

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

How could I achieve the same result with a C++11 Smart Pointer? Who knows what could happen before I have a chance to delete that memory.

So I guess I need to downcast to a C style pointer?

Upvotes: 5

Views: 631

Answers (2)

Praetorian
Praetorian

Reputation: 109219

If your code really looks like that in your snippet, shared_ptr is a bit of an overkill for the situation, because it looks like you do not need shared ownership of the allocated memory. unique_ptr has a partial specialization for arrays that is a perfect fit for such use cases. It'll call delete[] on the managed pointer when it goes out of scope.

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

Upvotes: 5

Karthik T
Karthik T

Reputation: 31952

std::shared_ptr has a method get which you can use to get a C style pointer to the variable. If that pointer is to a std::string, you need to further call the c_str() function to get a pointer to C style string.

edit: I notice the function is writing to the string as opposed to reading. You would need to resize the std::string first, and even after that, the pointer returned by c_str isnt meant for writing. std::shared_ptr should work though.

Upvotes: 3

Related Questions