C++ に finally ブロックは存在しない。まあ、どうってことはない。

#include <memory>

namespace Scoped_ {

class Base
{
public:
virtual ~Base() {}
};

template <typename Function>
class Impl
: public Base
{
Function func_;
public:
explicit Impl(Function func) : func_(func) {}
virtual ~Impl() { func_(); }
};
};

typedef std::auto_ptr<Scoped_::Base> Scoped;

template <typename Function>
inline Scoped make_scoped(Function func) {
return Scoped(new Scoped_::Impl<Function>(func));
}

#include <GL/gl.h>
#include "Scoped.hpp"

// 普通は、
//
// glBegin(GL_TRIANGLES);
// glVertex3f(...);
// :
// glEnd();
//
// みたいな感じで三角形のデータを定義するところを……

void draw_triangle() {

glBegin(GL_TRIANGLES);
Scoped finally(make_scoped(glEnd));

glVertex3f(1, 0, 0);
glVertex3f(0, 1, 0);
glVertex3f(0, 0, 1);
}

似たようなことをやってるひとはいると思うけど、調べてないので良く判らない。ちなみに、ここでは OpenGL のエラーチェックは割愛している。といっても、プリミティブ発行時にはエラーチェックはできないんだけど。