Renderbuffer::~Renderbuffer() { class CleanupTask : public ShareGroupTask { public: CleanupTask( GLuint id ) : m_id( id ) {} virtual void execute() { glDeleteRenderbuffers( 1, &m_id ); } private: GLuint m_id; }; if ( getGLId() && getShareGroup() ) { // make destructor exception safe try { getShareGroup()->executeTask( new CleanupTask( getGLId() ) ); } catch (...) {} } }
Shader::~Shader( ) { if ( getGLId() ) { if ( getShareGroup() ) { DEFINE_PTR_TYPES( CleanupTask ); class CleanupTask : public ShareGroupTask { public: static CleanupTaskSharedPtr create( GLuint id ) { return( std::shared_ptr<CleanupTask>( new CleanupTask( id ) ) ); } virtual void execute() { glDeleteShader( m_id ); } protected: CleanupTask( GLuint id ) : m_id( id ) {} private: GLuint m_id; }; // make destructor exception safe try { getShareGroup()->executeTask( CleanupTask::create( getGLId() ) ); } catch (...) {} } else { glDeleteShader( getGLId() ); } } }