They make a new scope. At the end of the scope, objects that were in it are deleted:
1 2 3 4 5 6 7 8 9 10
int main()
{
int a = 5;
{
int b;
cin >> b;
a += b;
} //b is no longer available in memory or in scope
cout << a;
}
This is useful for when you want to allocate a lot of memory for something without using new, and then delete it later in your code so it doesn't spend the entire rest of the application using memory it doesn't need.
Could also be useful for forcing a deconstructor. And when using boost.thread you can use a scoped lock within a local scope like that to work like a critical section.